Dann zeige uns doch mal das log.Ich komme einfach nicht weiter, ich verstehe es einfach nicht... Ich habe das jetzt auch in intelliJ drin und bekomme insgesamt 14
Dann zeige uns doch mal das log.Ich komme einfach nicht weiter, ich verstehe es einfach nicht... Ich habe das jetzt auch in intelliJ drin und bekomme insgesamt 14
Dann zeige uns doch mal das log.
public static boolean dateiPruefung(String filename){
boolean wahrheitswertVonZeile1 = false;
try(FileReader fileR = new FileReader(filename+".txt");
BufferedReader bufR = new BufferedReader(fileR)) {
String zeile;
zeile = bufR.readLine();
wahrheitswertVonZeile1 = zeile.startsWith("DATA:");
}
catch(IOException e) {
e.printStackTrace();
return false;
}
return wahrheitswertVonZeile1;
}
double flaeche = Math.PI * r^2;
double flaeche = Math.PI * r*r;
static double windenergieFeld[] = new double [arraygroesse];
windenergieFeld[i] = (1/2.)*rho*flaeche*Math.pow(geschwindigkeitsFeld[i]/3.6.,3);
windenergie
Zeile 103 wo hast du das i definiert?
Java:windenergieFeld[i] = (1/2.)*rho*flaeche*Math.pow(geschwindigkeitsFeld[i]/3.6.,3);
//Berechnung der Windenergie
public static double windenergie(double v) { // v soll aus der Text-Datei-Zeile ausgelesen werden
final int r = 20;
final double rho = 1.2225;
double flaeche = Math.PI*r^2;
static double windenergieFeld[] = new double [arraygroesse];
for(int i = 0; i<arraygroesse; i++) {
windenergieFeld[i] = (1 / 2.) * rho * flaeche * Math.pow(geschwindigkeitsFeld[i] / 3.6., 3);
if (v <= 2) {
System.out.println(uhrzeitenFeld[i] + "vWind = " + geschwindigkeitsFeld[i] + " km/h \t pWind = 0kW \t Wind zu schwach ");
}
else if (v >= 40) {
System.out.println(uhrzeitenFeld[i] + "vWind = " + geschwindigkeitsFeld[i] + " km/h \t pWind = 0kW \t Wind zu stark ");
}
else {
System.out.println(uhrzeitenFeld[i] + "vWind = " + geschwindigkeitsFeld[i] + " km/h \t pWind = " + windenergieFeld[i] + " kW");
}
}
}
Das war tatsächlich nur ein Flüchtigkeitsfehler. Paar Zeilen drunter habe ich die richtige mathematische Operation mit Math.pow() verwendet.Bitte schau Dir einmal die Operatoren in Java an. ^ gibt es aber das ist keine Potenzierung.
Das habe ich auch umgeändert, weil das intelliJ automatisch vorgeschlagen hat.lokale Variablen können nicht static sein. arraygroesse ist nicht bekannt!
Das habe ich jetzt auch eingefügt mit einer for Schleife.i nicht bekannt. Willst Du da also eine Schleife haben? Dann mach auch eine.
Ich dachte immer, dass ich bei Bruchrechnungen ein Punkt noch zusätzlich hinten setzen muss (ganz am Anfang bei den Übungen, wurde nämlich bspw. 1/2. gefordert, damit ein double rauskommt, sonst wirds ein int) Aber intelliJ hat den auch bemängelt und hab den jetzt rausgemacht.Und hinten ist ein . zu viel. Hinter dem 3.6 kommt erst ein . und dann ein , - der Punkt dürfte schlicht zu viel sein.
Wie kann ich die arraygroesse übergeben?arraygroesse ist eine lokale Variable einer anderen Methode.
import javax.swing.*;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class TextDateienEinlesenVerarbeiten {
public static void main(String[] args) throws Exception {
System.out.println("==============================");
System.out.println("=== Auswertung Windenergie ===");
System.out.println("==============================");
String filename = eingabeDateiname();
boolean pruefung = dateiPruefung(filename);
if (pruefung == true) {
datenAuslesen(filename);
} else {
System.out.println("Datei startet nicht mit DATA: -> Programmabbruch.");
System.exit(0);
}
windenergie(double v, double arraygroesse);
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ab hier drunter Methoden:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
//Eingabe des Dateinamens
public static String eingabeDateiname() {
String eingabe = JOptionPane.showInputDialog("Geben Sie den Dateinamen ohne .txt ein:");
return eingabe;
}
//Pruefen, ob die Datei mit DATA: startet -> Wahrheitswert zurueckgeben
public static boolean dateiPruefung(String filename) {
boolean wahrheitswertVonZeile1 = false;
try (FileReader fileR = new FileReader(filename + ".txt");
BufferedReader bufR = new BufferedReader(fileR)) {
String zeile;
zeile = bufR.readLine();
wahrheitswertVonZeile1 = zeile.startsWith("DATA:");
} catch (IOException e) {
e.printStackTrace();
return false;
}
return wahrheitswertVonZeile1;
}
//Datei ab Zeile 2 auslesen, falls dateiPruefung true zurueckgibt
static String[] uhrzeitenFeld;
static double[] geschwindigkeitsFeld;
public static boolean datenAuslesen(String filename) {
int zeile1Laenge = 0, arraygroesse = 0;
try (FileReader fileR = new FileReader(filename + ".txt");
BufferedReader bufR = new BufferedReader(fileR)) {
String zeile;
while ((zeile = bufR.readLine()) != null) { // so nicht notwendig
zeile1Laenge = zeile.length();
arraygroesse = Integer.parseInt(zeile.substring(6, zeile1Laenge + 1));
uhrzeitenFeld = new String[arraygroesse];
geschwindigkeitsFeld = new double[arraygroesse];
for (int i = 0; i < arraygroesse; i++) {
String zeileDaten;
zeileDaten = bufR.readLine();
uhrzeitenFeld[i] = zeileDaten.substring(0, 5);
geschwindigkeitsFeld[i] = Double.parseDouble(zeileDaten.substring(7, 12));
}
}
} catch (FileNotFoundException e) {
return false;
} catch (IOException e) {
return false;
}
return true;
}
//Berechnung der Windenergie
public static void windenergie(double v, double arraygroesse) { // v soll aus der Text-Datei-Zeile ausgelesen werden
final int r = 20;
final double rho = 1.2225;
double flaeche = Math.PI * Math.pow(r, 2);
double[] windenergieFeld = new double[arraygroesse];
for (int i = 0; i < arraygroesse; i++) {
windenergieFeld[i] = (1 / 2.) * rho * flaeche * Math.pow(geschwindigkeitsFeld[i] / 3.6, 3);
if (v <= 2) {
System.out.println(uhrzeitenFeld[i] + "vWind = " + geschwindigkeitsFeld[i] + " km/h \t pWind = 0kW \t Wind zu schwach ");
} else if (v >= 40) {
System.out.println(uhrzeitenFeld[i] + "vWind = " + geschwindigkeitsFeld[i] + " km/h \t pWind = 0kW \t Wind zu stark ");
} else {
System.out.println(uhrzeitenFeld[i] + "vWind = " + geschwindigkeitsFeld[i] + " km/h \t pWind = " + windenergieFeld[i] + " kW");
}
}
}
}
Ja genau, deswegen meine Frage, wie kann ich die arraygroesse und geschwindigkeit übergeben von der Methode datenAuslesen in die main?Java:windenergie(double v, double arraygroesse); Diese variablen hast du nicht in der main. Geht nicht.
Wie kann ich die arraygroesse übergeben?
Das ist soweit richtig. Statt 1 / 2 schreibst Du 1. / 2 und dieses 1. steht für 1.0. Aus dem Integer Literal 1 wird so ein Double Literal.Ich dachte immer, dass ich bei Bruchrechnungen ein Punkt noch zusätzlich hinten setzen muss (ganz am Anfang bei den Übungen, wurde nämlich bspw. 1/2. gefordert, damit ein double rauskommt, sonst wirds ein int) Aber intelliJ hat den auch bemängelt und hab den jetzt rausgemacht.
Der Mehrwert dieses Streifens ist, dass Du einen Hinweis bekommst, wie lang so eine Zeile maximal sein sollte.Noch eine Frage zu intelliJ:
Was ist dieser weiße senkrechte Balken mitten im Bildschirm? Kann ich den irgendwie deaktivieren? Der stört nur und hat keinen Mehrwert.
Ahhh, okay verstanden. Dann habe ich wieder was Neues dazugelernt.Aber jetzt hast Du ja schon einen Dezimalpunkt in 3.6. Mit 3.6. hättest Du ja zwei Dezimalpunkte. Du kannst also nur einen Dezimalpunkt haben.
Ach dafür ist der gedacht. Dannn nehme ich das von vorher zurück, dann bietet mir der Streifen doch einen Mehrwert. 😆Der Mehrwert dieses Streifens ist, dass Du einen Hinweis bekommst, wie lang so eine Zeile maximal sein sollte.
arraygroesse = Integer.parseInt(zeile.substring(6));
Du kannst diese als Variable in der Klasse halten.
public class TextDateienEinlesenVerarbeiten {
public static void main(String[] args) throws Exception {
int arraygroesse = 0;
Dem Teil kann ich noch nicht so ganz folgen, was ich in meinem programm dafür ändern muss.Aber Du hast ja auch das Array geschwindigkeitsFeld - du kannst die Größe ja auch da heraus lesen. Generell wäre auch denkbar, dass Du an der Stelle, an der Du dieses andere Array erstellst auch direkt das andere Array erstellst.
Nein nicht ganz. So ist das immer noch eine lokale Variable.Meinst du das so?
class ClassName {
SomeType var1; // Instance variable / Instanzvariable - Derzeit noch uninteressant, da bei dir noch alles static ist.
static SomeType var2; // class variable / Klassenvariable - Das meinte ich.
SomeReturnType someMethod(....) {
SomeType var3; // local variable / Lokale Variable.
}
}
public class TextDateienEinlesenVerarbeiten {
static String[] uhrzeitenFeld;
static double[] geschwindigkeitsFeld;
static double[] windenergieFeld; // Hier kommt das eine Array mit dazu
public static boolean datenAuslesen(String filename) {
// ...
uhrzeitenFeld = new String[arraygroesse];
geschwindigkeitsFeld = new double[arraygroesse];
windenergieFeld = new double[arraygroesse]; // Hier wird es direkt mit initialisiert
// ...
}
}
Kleine Übersicht:
import javax.swing.*;
import java.io.*;
import java.util.*;
public class Uebung{
//Deklaration / Initialisierung
static final int r = 20; //m
static final double dichte = 1.2225; //kg/m^3
static String[] geleseneZeilen;
static int zahl = 0;
static double P_Wind;
public static void main(String[] args) {
//Programmkopf
System.out.println("==============================");
System.out.println("=== Auswertung Windenergie ===");
System.out.println("==============================");
//Programmstart
String eingabe = JOptionPane.showInputDialog("Dateiname:"); //ohne txt
eingabe = eingabe + ".txt";
Daten_einlesen(eingabe);
//Initialisiert
geleseneZeilen = new String[zahl];
//Datei in Array geschrieben
try{
FileReader fr = new FileReader(eingabe);
BufferedReader br = new BufferedReader(fr);
for(int i = 0; i < zahl; i++) {
geleseneZeilen[i] = br.readLine();
}
br.close();
}
catch(IOException e) {
}
//Zahlen filtern und Ausgabe
Ausgabe();
} //Ende der main-Methode
public static double Berechnung_Windleistung(double v) {
//Umrechnung in m/s
v = v/3.6;
double A = Math.PI*Math.pow(r,2);
double P_Wind = 0.5*dichte*A*Math.pow(v,3)/1000;
P_Wind = Math.round(P_Wind*10.0)/10.0; //Runden auf eine Nachkommastelle
return P_Wind; //ans Ende
}
public static void Daten_einlesen (String eingabe) {
//Daten einlesen
try{
FileReader fr = new FileReader(eingabe);
BufferedReader br = new BufferedReader(fr);
String zeile = br.readLine();
if(zeile.startsWith("DATA:")) {
String Data = zeile.substring(6);
zahl = Integer.parseInt(Data);
}
else{
System.out.println("Kaputter Datensatz\n--> Programmende");
System.exit(0);
}
}
catch(IOException e) {
System.out.println(e);
}
}
public static void Ausgabe() {
for(int i = 0; i < zahl; i++) {
String Zeit = geleseneZeilen[i].substring(0,5);
String Geschwindigkeit = geleseneZeilen[i].substring(7);
double v = Double.parseDouble(Geschwindigkeit);
System.out.print(Zeit+" vwind = "+v+" km/h\t");
P_Wind = Berechnung_Windleistung(v);
if(v<2) {
P_Wind = 0.0;
System.out.print(P_Wind+" kW\t\tWind zu schwach");
}
if(v>=40) {
P_Wind = 0.0;
System.out.println(P_Wind+" kW\t\tWind zu stark");
}
else{
System.out.println(P_Wind+" kW");
}
}
}
}
Ahhh, da war der Fehler, du hast recht, ich danke dir.Also musst Du in Zeile 34 die erste Zeile überspringen. Dies könntest Du machen, indem Du die erste Zeile einfach liest (ohne etwas mit ihr zu machen).
Das Beispiel war hilfreich zur gedanklichen Darstellung, dankeschön.(Stell Dir das so vor, als ob es ein Aktenordner wäre. Derzeit hast Du Dinge wie:
- Ordner aus Regal nehmen
- Erstes Blatt prüfen
- Ordner ins Regal zurück stellen
- Ordner aus Regal nehmen
- n Zettel durchgehen
- Ordner ins Regal zurück stellen
import javax.swing.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Uebung {
static final int r = 20; // [m]
static final double RHO = 1.2225; // [kg/m3]
static String[] geleseneZeilen;
static int a = 0;
static int zahl = 0;
static double P_Wind;
public static void main(String[] args) {
//Programmkopf
System.out.println("================================");
System.out.println("=== Auswertung Windenenergie ===");
System.out.println("================================");
String filename = "";
String eingabe = JOptionPane.showInputDialog("Dateiname:"); // ohne .txt
filename = eingabe+".txt";
Daten_einlesen(filename);
geleseneZeilen = new String[zahl];
//Datei in Array schreiben
try{
FileReader fileR = new FileReader(filename);
BufferedReader bufR = new BufferedReader(fileR);
bufR.readLine(); //damit erste Zeile gelesen wird, aber nichts angestellt wird, somit kann unten ab Zeile 2 abgearbeitet werden
for(int i = 0; i < zahl; i++){
geleseneZeilen[i] = bufR.readLine();
}
}
catch(IOException e){
System.out.println("Fehler in Dateibehandlung.\n" +e);
}
Ausgabe();
} //Ende main-Methode
private static void Ausgabe() {
for(int i = 0; i < zahl; i++){
String Zeit = geleseneZeilen[i].substring(0,5);
String Geschwindigkeit = geleseneZeilen[i].substring(7);
double v = Double.parseDouble(Geschwindigkeit);
System.out.print(Zeit + " vWind = " +v + " [km/h]\t pWind = ");
P_Wind = Berechnung_Windleistung(v);
if(v<2){
P_Wind = 0.0;
System.out.print(P_Wind + " kW\t\tWind zu schwach"); //print ohne ln, damit hinten dran gehangen wird
}
if(v>=40){
P_Wind = 0.0;
System.out.print(P_Wind + " kW\t\tWind zu stark"); //println mit ln, damit neue Zeile
}
else{
System.out.println(P_Wind + " kW"); //println mit ln, damit neue Zeile
}
}
}
private static double Berechnung_Windleistung(double v) {
v = v/3.6;
double A = Math.PI*Math.pow(r,2);
double P_Wind = ((1/2.)*RHO*A*Math.pow(v,3))/1000; // geteilt durch 1000, damit von W in kW
P_Wind = Math.round(P_Wind*10.0)/10.0; // damit auf 1 Nachkommastelle gerundet (*10.0/10.0)
return P_Wind;
}
private static void Daten_einlesen(String filename) {
try{
FileReader fileR = new FileReader(filename);
BufferedReader bufR = new BufferedReader(fileR);
String line = bufR.readLine();
if(line.startsWith("SIZE:")){
String Size = line.substring(6);
zahl = Integer.parseInt(Size);
}
else{
System.out.println("Kaputter Datensatz\n-> Programmende");
System.exit(0);
}
}
catch(IOException e){
System.out.println("Fehler in Dateibehandlung.\n" +e);
}
}
}
Okay, das habe ich jetzt damit erfolgreich gelöst.1) Du hast zwei Unabhängige if Anweisungen. Du prüfst erst auf v < 2 und machst dann ggf. etwas. Dann kommt ein anderes if und dann machst Du - je nachdem ob die Bedingung wahr ist, entweder den Block vom if oder den Block vom else.
Du willst also vermutlich ein if else if else Konstrukt haben.
2) Du fängst eine IOException und keine NullPointerException. Eine NPE sollte man auch nicht fangen sondern statt dessen an Stellen, bei denen etwas null sein kann, dies vorher prüfen. Eine NPE ist also ein "EntwicklerHatGeschamptException"
private static void Daten_einlesen(String filename) {
try{
FileReader fileR = new FileReader(filename);
BufferedReader bufR = new BufferedReader(fileR);
String line = bufR.readLine(); //erste Zeile wird eingelesen
if(line.startsWith("SIZE:")){ //wenn erste Zeile mit "SIZE:" beginnt:
String Size = line.substring(6); // Wert hinter Size (Anfangsindex 6 bis unendlich)
zahl = Integer.parseInt(Size); // Wert in einen INT parsen, damit damit gearbeitet werden kann
}
else{
System.out.println("Kaputter Datensatz\n-> Programmende");
System.exit(0);
}
}
catch(NullPointerException e){
System.out.println("Fehler in Dateibehandlung.\n" +e);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
Nein, das macht nichts leichter. Es geht ja darum, vernünftigen Code zu schreiben.Aber das macht es mir doch leichter, wenn ich einfach einen catch(NPE e) hinten dran hänge, oder nicht? 😁
Da steht, dass da entweder der Inhalt der Zeile oder eben null zurück gegeben wird.Returns:
A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached without reading any characters
Bei einer leeren Datei würde ich ja dann logischerweise null zurückbekommen, da nichts drin steht in der Zeile, die da gerade ausgelesen wird.Da steht, dass da entweder der Inhalt der Zeile oder eben null zurück gegeben wird.
private static void Daten_einlesen(String filename) {
try{
FileReader fileR = new FileReader(filename);
BufferedReader bufR = new BufferedReader(fileR);
String line = bufR.readLine(); //erste Zeile wird eingelesen
if(line != null) {
if (line.startsWith("SIZE:")) { //wenn erste Zeile mit "SIZE:" beginnt:
String Size = line.substring(6); // Wert hinter Size (Anfangsindex 6 bis unendlich)
zahl = Integer.parseInt(Size); // Wert in einen INT parsen, damit damit gearbeitet werden kann
}
}
else{
System.out.println("Kaputter Datensatz\n-> Programmende");
System.exit(0);
}
}catch (IOException e){
System.out.println("Fehler in Dateibehandlung.\n" +e);
}
}
Aber lieber lerne ich es von Anfang dann direkt richtig, anstatt mich am Ende schwierig umgewöhnen bzw. schlechte Angewohnheiten abeignen zu müssen.Wenn Du gerade ganz am Anfang bist, dann geht es vor allem um die Java Sprache und noch nicht so sehr um solche Feinheiten!
zahl soll den Wert hinter dem Wort "SIZE:" darstellen. SIZE: 12 -> zahl = 12.Du veränderst da eine Instanzvariable zahl - die besagt nicht wirklich so viel aus.
Habe ich das hier irgendwo geschlossen? Ich dachte, ich müsste dafür bufR.close() verwenden, anderenfalls habe ich das eher unbewusst gemacht.Reader werden nicht geschlossen
BufferedReader reader
try {
reader = ....
// ..
} finally {
try {
if (reader != null) reader.close();
} catch (Exception ex) { }
}
try (BufferedReader reader = .... ) {
// ...
}
Das ist sehr lobenswert, aber man muss irgendwo eine Grenze ziehen. Der Bereich Clean Code ist sehr umfangreich und da muss man immer überlegen, was Sinn macht oder nicht. Aber ja - einfache Punkte sollte man zumindest richtig vormachen / erwähnen - aber das ist dann nichts, wo ich direkt erwarten würde, dass dies dann zukünftig direkt eigenständig umgesetzt wird.Aber lieber lerne ich es von Anfang dann direkt richtig, anstatt mich am Ende schwierig umgewöhnen bzw. schlechte Angewohnheiten abeignen zu müssen.
Also die Variable ist ein int und enthält daher eine Zahl. Aber was für eine Bedeutung hat es? Da es bei SIZE: aufgeführt wird, kann es sowas wie groesse oder anzahlDatensätze oder so sein.zahl soll den Wert hinter dem Wort "SIZE:" darstellen. SIZE: 12 -> zahl = 12.
Ich habe static int zahl = 0 direkt unter der Klasse stehen, damit ich darauf im gesamten Programmcode drauf zugreifen kann. Würde ich das unter main schreiben, dann könnte ich darauf ja nicht mehr zugreifen. Da wusste ich noch nicht genau, wie ich das anders lösen sollte.
Mal um auf den Punkt einzugehen, weil du mich da sehr oft drauf hinweist, ich das aber nur gelegentlich befolge, weil ich das andere noch gewohnt bin von Beginn an bzw. so wie es in meinen Unterlagen steht.Daher gibt es try with resources:
private static void datenEinlesen(String filename) {
try(BufferedReader bufR = new BufferedReader(new FileReader(filename))) {
String line = bufR.readLine(); //erste Zeile wird eingelesen
if (line != null) { //wenn die ERSTE Zeile LEER ist, dann spring zu else, sonst arbeite hier drunter weiter ab
if (line.startsWith("SIZE:")) { //wenn erste Zeile mit "SIZE:" beginnt:
String Size = line.substring(6); // Wert hinter Size (Anfangsindex 6 bis unendlich)
zahl = Integer.parseInt(Size); // Wert in einen INT parsen, damit damit gearbeitet werden kann
}
} else {
System.out.println("Kaputter Datensatz\n-> Programmende");
System.exit(0);
}
} catch (IOException e) {
System.out.println("Fehler in Dateibehandlung.\n" + e);
}
}
Ja genau, so würde der Code mit try with resources aussehen. Den anderen Punkt hat @fhoffmann bereits gut beantwortet.Würde das für mein Beispiel dann so aussehen?
if (line != null) { //wenn die ERSTE Zeile LEER ist, dann spring zu else, sonst arbeite hier drunter weiter ab
if (line.startsWith("SIZE:")) { //wenn erste Zeile mit "SIZE:" beginnt:
String Size = line.substring(6); // Wert hinter Size (Anfangsindex 6 bis unendlich)
zahl = Integer.parseInt(Size); // Wert in einen INT parsen, damit damit gearbeitet werden kann
} else {
// Hier hast Du nichts ausgegeben. Daher kommt auch keine Ausgabe in diesem Fall!
}
} else {
System.out.println("Kaputter Datensatz\n-> Programmende");
System.exit(0);
}