Hilfe: variable may not have been initialised

Hallo,
ich bin Student und habe dieses Semester das Wahlfach Info3 gefählt, stecke jetzt also seit ein paar Wochen in den ersten Zügen mit java. Info1 und 2 haben wir C progarmmiert - also das Grobe ist schon vorhanden. :slight_smile:

Es ist jetzt schon öfters folgendes Problem bei mir aufgetreten. Diesmal durchlaufe ich in der main eine Schleife, von dort aus gehe ich mit ein paar Übergabewerten in eine Methode und von dieser wiederum gehe ich in die Methode „eingabe()“ (siehe unten).
Ist es irgendwie möglich die deklaration/initialisierung von „i“ in der Methode eingabe() durchzuführen, auch wenn diese Methode mehrmals aufgerufen wird? Oder muss ich das i immer bei jedem Aufruf der Methode von ganz oben durchreichen.
Weiß da vielleicht jemand einen Rat?
Danke im vorraus.
gegoogelt hab ich schon und die Sufu hab ich auch schon benutzt.
PS try-catch-Block hat auch nicht geholfen.

import java.io.InputStreamReader;
import java.io.IOException;

public class Benutzereingabe 
{	

	public Benutzereingabe()throws IOException
	{
	}
	
	static String eingabe(String[][] lief)throws IOException
	{
		
	InputStreamReader inpu = new InputStreamReader(System.in);
	BufferedReader[] buffer = new BufferedReader[lief.length];
	if(buffer[0]==null)
	{int i =0;}
	String eingab;
	eingab = buffer**.readLine();
	i++;
	buffer**.close();
	return eingab;

	}
}```

Hm. Welchen Zweck hat die Variable ‘i’ denn da überhaupt? Also, was ist “lief”? Sowas wie

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Benutzereingabe
{

    public Benutzereingabe()throws IOException
    {
    }

    static String eingabe(String[][] lief)throws IOException
    {
        InputStreamReader inpu = new InputStreamReader(System.in);
        BufferedReader buffer = new BufferedReader(inpu);
        String eingab = buffer.readLine();
        buffer.close();
        return eingab;

    }
}

meinst du ja nicht, oder?

Danke für die schnelle Antwort erst mal.

Das i ist dafür da, weil ich die Methode ja mehrmals aufrufen will. So wie du es jetzt gepostet hast, sah meine Methode bevor ich das mit dem i versucht habe auch aus, bloß das buffer.close() nicht drin stand. Ohne buffer.close() funktioniert es auch, mit close kommt immer eine NullPointerException, da die variable buffer ja schon vorhanden ist, also nicht neu deklariert werden kann und der Stream beim zweiten durchlauf geschlossen ist und daher funktioniert es leider nicht.

Das lief ist ein doppeltes String-Array in dem schon Strings drin stehen, ich lasse Abfragen ob ein Schreibfehler vorhanden ist, diesen kann man dann korrigieren. Dachte daher ich mach einfach den Array mit Stringbuffern so lang ist wie das lief-Stringarry. Ist also nicht entscheident für die Methode. Hört sich wüst an, was es wohl auch ist. Aber mich interessiert einfach ob es für das Problem eine Lösung gibt.

Ich habe in meinem Post noch vergessen gehabt den Filereader in den Bufferedreader zu schreibn, wobei mir jetzt gerade erst klar wird, das ich gar nicht weiß, wie ich das machen sollte. So wie es jetzt da steht, macht java ja auch bei jedem Aufruf der Methode ein ganzes neues BufferedReader-Array. Und so etwas in der Art “buffer**(inpu);” funktioniert ja auch irgendwie nicht.

Das war nicht ganz zu Ende gedacht von mir. sorry
Aber wie gesagt, ursprünglich war meine Methode fast identisch mit deiner jetzt. Also wie kann ich das machen, dass man diese mehrmals aufrufen kann, und den Stream am Ende trotzdem schließt.
Danke

Ja, klingt ein bißchen wirr. Also, es soll dieser String-Array übergeben werden - aber warum ist der zweidimensional?
Ehrlich gesagt habe ich bisher wohl auch noch nicht ausprobiert, was passiert, wenn man System.in mit ‘close’ schließt.

Wäre für das, was du vorhast, vielleicht ein Scanner geeignet?

import java.io.*;
import java.util.*;

public class Benutzereingabe
{
    public static void main(String args[])
    {
        String vorgabe[] = new String[] {
            "Hier",
            "ist",
            "ein",
            "Tippehler"
        };
        eingabe(vorgabe);
    }

    static String eingabe(String[] vorgabe)
    {
        Scanner scanner = new Scanner(System.in);
        for (int i=0; i<vorgabe.length; i++)
        {
            System.out.println("Vorgabe: "+vorgabe**);
            System.out.print("Eingabe: ");
            String line = scanner.nextLine();
            System.out.println("Eingabe war "+line);
        }
        return "Was auch immer...";
    }
}

Ich habe eben das “in” von “System.in” in der API angeschaut und du hast Recht, dieser Stream ist immer geöffnet und man brauch ihn gar nicht zu schließen.

Der InputStreamReader und der BufferedReader ist hier wohl nicht die beste Wahl.
Da hast du mir schon mal gut weitergeholfen, ich werde jetzt den Scanner verwenden.

Habe jetzt ziemlich lange über das eigentliche Problem nachgedacht und rumprobiert. Ich wollte ja in meinem ersten post die Variable i in einer if-Bedingung erzeugen. Das Problem war, dass diese Variable dann im folgenden Programm natürlich nicht bekannt ist.
Das zweidimensionale String-Array hat dann auch noch Verwirrung gestiftet, wie gesagt dessen Länge sollte einfach nur die Länge des BufferedReader-Array vorgeben/entsprechen.
Ich hatte mein alte Methode noch mal umgeändert, jetzt übergebe ich das i, es ist beim ersten Aufruf glecih “0”, beim zweiten “1” usw.
Jetzt hab ich die Stingvariable eingab und diese BuffReader-Geschichte in die if-Bedingung gepackt und das ist natürlich wieder das alte Problem. Im folgenden Programm sind diese dann wieder nicht bekannt.
Kann man Variablen in solchen Fällen irgendwie in einer if-Bedingung o.ä. erzeugen, und diese sozusagen global setzen, dass sie in dem restlichen Programm dann bekannt sind, jedoch bei mehrmaligen Aufruf der Methode nur einmal erzeugt werden. (eben durch eine if-Bedinung oder eine Schleife die nur ein einziges Mal beim ersten Aufruf er Methode durchlaufen wird)

PS Habe jetzt das Sting[][] einfach durch die Zahl 20 ausgetauscht,

public class Benutzereingabe 
{	

	public Benutzereingabe()throws IOException
	{
	}
	
	static String eingabe(int i)throws IOException
	{
		if(i==0)
		{
		String eingab="";
		BufferedReader[] buffer = new BufferedReader[20];
		}
		
	buffer**=new BufferedReader(new InputStreamReader(System.in));
	eingab = buffer**.readLine();
	buffer**.close();
	}
	return eingab;
}

Nochmal kurz: Warum willst du 20 BufferedReaders erstellen?
Allgemein:

String method(int x)
{
    if (x == 0)
    {
        String result = "Hallo";
    }
    return result;
}

geht natürlich nicht. Die Variable muss in dem { Block } dekalriert werden, wo sie auch verwende wird. Sowas wie

String method(int x)
{
    String result = "Tja, irgendein Wert halt...";
    if (x == 0)
    {
        result = "Hallo";
    }
    return result;
}

würde gehen.

Ich habe das jetzt mit dem Scanner gelöst wie du es vorgeschlagen hast. (siehe unten) Ohne den try-catch-Block wären es nur drei Zeilen und man kann die Methode auch mehrmals aufrufen. Hatte nicht bedacht, dass die erzeugten Variablen ja wieder freigegeben werden sobald man den Block verlässt.

Konnte mich die ganze Zeit auch nicht damit abfinden, dass man nicht in einem Block eine Variable erzeugen kann und diese dann überall bekannt ist. In C konnte man das machen indem man diese Varialble “global” gesetzt hat und wenn man den Block gar nicht durchlaufen ist, wurde die Variable auch nicht erzeugt.
Das ist in java wohl nicht möglich. Danke dir für deine Mühen und Geduld.

import java.util.Scanner;

public class Benutzereingabe 
{	

	public Benutzereingabe()
	{
	}
	
	static String lesen()
	{	
		Scanner scanner;
		String eingabe="";
		try
		{
			scanner = new Scanner(System.in);
			eingabe = scanner.nextLine();
		}
		catch(Exception e)
		{
		System.out.println("
  FEHLER BEI DER BENUTZEREINGABE
");
		}
		return eingabe;
	}
}