# StringToInt() - Type mismatch: cannot convert from...



## Stefan_Wegener (9. Apr 2006)

Hallo, ich habe eine Frage, ich versuche gerade eine einfache .txt Datei auszulesen. Das funktioniert für Strings ganz gut mit dem untenstehenden Code, allerdings benötige ich einen Teil der Datei als Integer. Dazu habe ich die Methode StringToInt(). Möchte ich diese nun aber in der Methode DateiEinlesen() mit "int menge3 = StringToInt(menge);" aufrufen, dann bekomme ich den Fehler "Type mismatch: cannot convert from void to int". Könnte mir da bitte jemand einen Hinweis geben, woran das liegen kann?
Vielen Dank schonmal.


```
import java.io.*;

public class FileIO {

	private FileIO() {
	}

	public static void StringToInt (String x){
		{
			String k = x;
			int result;
			try {
				result = Integer.parseInt(k); 
			} catch(NumberFormatException exc) {
				System.out.println("Ungültig " + k);
				return;
			}
			System.out.println("Die Zahl ist " + result);
		}
	}

	public static String DateiEinlesen(String inName)
	throws FileNotFoundException, IOException {
		BufferedReader is = new BufferedReader(new FileReader(inName));
		String menge = null;
		String line = null;

		while ((line = is.readLine()) != null) {
			System.out.println(line);
			int laenge = line.length();
			System.out.println(laenge);
			menge = line.substring(4,laenge);
			int menge3 = StringToInt(menge);
			System.out.println("Menge: " +menge);
		}
		
		return line;
	}

public static void main(String[] args) {
		try{
		FileIO.DateiEinlesen("mengen.txt");
		} catch (FileNotFoundException e) {
			System.err.println(e);
		}	catch (IOException e) {
			System.err.println(e);		
		}
	}
```


----------



## SebiB90 (9. Apr 2006)

deine methode StringToInt muss auch was zurück geben 
also muss das erstmal int StringToInt heißen und nicht void StringToInt
dann musste am ende der methode auch return result; machen, dann klappt es


----------



## Stefan_Wegener (9. Apr 2006)

Danke erstmal für die Antwort. Ich hoffe es kam nicht zu sehr durch, dass ich ein ziemlicher Anfänger bin.  Habe ich das richtig verstanden, dass die Methode dann so aussehen soll?


```
public static int StringToInt(String x){
		{
			String k = x;
			int result;
			try {
			result = Integer.parseInt(k); 
			} catch(NumberFormatException exc) {
				System.out.println("Ungültig " + k);
				return result;
			}
			System.out.println("Die Zahl ist " + result);
		}
		return result;
	}
```

Wenn sie so aussieht, dann wird mir der "int menge3 = StringToInt(menge);" - Aufruf nicht mehr angemarkert, aber bei dem zweiten "return result;" bekomme ich die Meldung "result cannot be resolved". Woran könnte das liegen?


----------



## Illuvatar (9. Apr 2006)

Eine Lokale Variable ist nur solange gültig, bis der ausführende Anweisungsblock beendet ist. Und du machst da einen eigentlich unnötigen Anweisungsblock rein, und zwar

```
public static int StringToInt(String x){ 
      {  //von hier
         String k = x; 
         int result; 
         try { 
         result = Integer.parseInt(k); 
         } catch(NumberFormatException exc) { 
            System.out.println("Ungültig " + k); 
            return result; 
         } 
         System.out.println("Die Zahl ist " + result); 
      }  //bis hier
      return result; 
   }
```

Wenn du den weglässt, sieht das so aus:

```
public static int StringToInt(String x){ 
      String k = x; 
      int result; 
      try { 
      result = Integer.parseInt(k); 
      } catch(NumberFormatException exc) { 
         System.out.println("Ungültig " + k); 
         return result; 
      } 
      System.out.println("Die Zahl ist " + result); 
      return result; 
   }
```


----------



## Stefan_Wegener (9. Apr 2006)

Illuvatar hat gesagt.:
			
		

> Wenn du den weglässt, sieht das so aus:
> 
> ```
> public static int StringToInt(String x){
> ...



Danke erstmal für die Antwort. Ich weiss nicht, ob ich mich gerade extrem blöd anstelle, aber ich komm an der Stelle einfach nicht weiter. Wenn ich die Methode genau so übernehme, dann bekomm ich als Fehler "The local variable result may not have been initialized". Funktioniert das bei Dir? Kann es noch woanders dran liegen? Sorry, wenn ich damit nerve, aber ich hänge hier gerade total.


----------



## kaie (9. Apr 2006)

Wie die Fehlermeldung schon sagt: Deine Variable _result_ wird nicht initialisiert, wenn eine Exception beim Parsen aufgetreten ist. Entweder ergänzt Du einen beliebigen Startwert, oder Du gibst direkt irgendeine Zahl zurück. Oder, was am schönsten wäre, Du läßt einfach gleich alle überflüssigen Variablen weg:


```
public static int StringToInt(String x)
{ 
  try { 
    return Integer.parseInt(x); 
  } catch(NumberFormatException exc) { 
    System.out.println("Ungültig " + x); 
    return -1; 
  } 
}
```
*kaie*


----------



## SammY (11. Apr 2006)

Versuchs mal so:


```
public static int StringToInt(String x){ 
      String k = x; 
      int result = 0;  //du musst die variable initialisieren 
      try { 
      result = Integer.parseInt(k); 
      } catch(NumberFormatException exc) { 
         System.out.println("Ungültig " + k); 
         return result; 
      } 
      System.out.println("Die Zahl ist " + result); 
      return result; 
   }
```


----------



## Stefan_Wegener (12. Apr 2006)

Vielen Dank nochmal für die Antworten. Es funktioniert!


----------



## Spoocky (19. Jul 2006)

bei mir liefert das programm nur 0 oder 0.0 zurück, es gibt auch die Fehlermeldung aus, bei der "ungültig" angezeigt wird.

woran kann das liegen ?


----------



## Beni (19. Jul 2006)

"parseInt" bekommt wohl eine falsch formatierte Eingabe. Welchen Wert hat denn "k" in der "stringToInt"-Methode?


----------



## Spoocky (19. Jul 2006)

```
public static int StringToInt(String x){
      String k = x;
```

so wie oben dargestellt. k wird x zugewiesen und x wird übernommen. Die übernommenen variablen sind alle String;


----------



## Beni (19. Jul 2006)

Ja, aber das sagt doch nichts über den _Wert_ aus :wink: Interessant ist, was "System.out.println( "\"" + k + "\"");" ausgibt. Wenn da nämlich etwas wie "    123" oder "abc" steht, kann "parseInt" nichts damit anfangen, und wirft eine Exception ("k" darf nur Zahlen als Wert haben).


----------



## Spoocky (19. Jul 2006)

ok: die Variaben-Inhalte haben folgende Beispielwerte: 0,0125 16,125  6,105.

Gibt es da ein Problem bei der Umwandlung?


----------



## Beni (19. Jul 2006)

Ja: es sind keine Integer (=Ganzzahlen). Damit du mit Kommazahlen arbeiten kannst, must du "int" mit "double", "Integer.parseInt" mit "Double.parseDouble" ersetzen. "double" ist eine Flieskommazahl, wird also diese Wert verarbeiten können.

Aber das ist noch nicht genug, "Double.parseDouble" erwartet als Trennzeichen kein Komma "," sondern ein Punkt ".". Also etwas wie "0.0125". Entweder gibst du die Daten anders ein, oder du benutzt "replace" um die Kommas auszutauschen.


----------



## Spoocky (19. Jul 2006)

danke erstmal.

Habe jetzt "Int" durch "Double" ersetzt. Jetzt gibts aber ein Problem mit der "return-Anweisung". Hier steht, dass double nicht in int umgewandelt werden kann. Gibts da auch nen Trick?


----------



## Beni (19. Jul 2006)

Wenn du mit Kommazahlen arbeiten willst, musst du natürlich _überall_ "int" durch "double" ersetzen.

Wenn du den Teil hinter dem Komma abschneiden willst, kannst du einen Cast machen:

```
double d = ...
int i = (int)d;
```


----------



## Spoocky (19. Jul 2006)

danke. funktioniert alles!


----------

