Hilfe - java.lang.RuntimeException: Uncompilable source code - incompatible types

Status
Nicht offen für weitere Antworten.

steve46

Mitglied
Hallo bin neu hier und brauche gleich mal eure Hilfe

Dieses Programm was ich geschrieben, da soll der User den Radius des Kreises eingeben können und die Fläche wird berechnet doch irgendetwas stimmt nicht:

Java:
import java.io.*;
class kreis
{
    public static void main ( String[] args) throws IOException
    {
      InputStreamReader inStream =
              new InputStreamReader ( System.in );
      BufferedReader stdin =
              new BufferedReader ( inStream );
      int radius;
      int pi;

      System.out.println("Geben sie den Radius ein: ");
      radius = stdin.readLine();
      pi = stdin.readLine();

      int result = (radius*radius*pi);

      System.out.println("Fläche: " + result);
     }
    }

Fehlermeldung:

run:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - incompatible types
Geben sie den Radius ein:
required: int
found: java.lang.String
at kreis.main(Main.java:14)
Java Result: 1
ERSTELLEN ERFOLGREICH (Gesamtzeit: 0 Minuten 0 Sekunden)

lg steve46
 
Zuletzt bearbeitet von einem Moderator:
pi ist vom typ double und nicht int

double pi = Math.PI;

beim radius kannst du es auch so machen


String text = stdin.readLine();
readLine ist immer ein string.. den dann parsen

int radius = Integer.parseInt(text);

aus dem String wird eine Zahl gemacht..

viel erfolg!

ach ja die Math ist eine nette klasse
besser:
result = pi*Math.pow(radius,2);
die 2 steht für den exponenten..


UND

bitte schreib nicht HILFE!!
dein Thema sollte schon besser gewählt sein 😀
 
Zuletzt bearbeitet:
achja =)

Java:
import java.io.*;
class kreis
{
    public static void main ( String[] args) throws IOException
    {
      InputStreamReader inStream =
              new InputStreamReader ( System.in );
      BufferedReader stdin =
              new BufferedReader ( inStream );
      int radius;
      double pi;
 
      System.out.println("Geben sie den Radius ein: ");
      String text = stdin.readLine();
      radius = Integer.parseInt(text);
      pi = Math.PI;
 
      int result = (pi*Math.pow(radius,2));
 
      System.out.println("Fläche: " + result);
     }
    }

voila!
 
besser:
result = pi*Math.pow(radius,2);
die 2 steht für den exponenten..
Nein. Nix besser. Als Begründung wieder mal ein böses Microbenchmark:
Java:
public class _ {
	
	//square and multiply: reicht für ganzzahlicge exponenten völlig aus
	private static double pow(double base, int exponent){
		double result=1; 
		for(double x=base; exponent>0;x*=x,exponent>>=1){
			if((exponent&1)==1) result*=x;
		}
		return result;
	}

	//zum quadrieren lohnt es sich eigentlich überhaupt nicht
	private static double square(double x){
		return x*x;
	}
	
	public static void main(String..._){
		final double MAX=10;
		final double DX=0.0000001;
 
		//Kleiner vergleich: laufen lassen, zeiten anguggen		

		long tMathPow=System.currentTimeMillis();
		for(double x=0; x<MAX; x+=DX){
			Math.pow(x,2);
		}
		tMathPow=System.currentTimeMillis()-tMathPow;
		
		long tPow=System.currentTimeMillis();
		for(double x=0; x<MAX; x+=DX){
			pow(x,2);
		}
		tPow=System.currentTimeMillis()-tPow;
		
		long tSquare=System.currentTimeMillis();
		for(double x=0; x<MAX; x+=DX){
			square(x);
		}
		tSquare=System.currentTimeMillis()-tSquare;
		
		System.out.println("Benötigte Zeiten [ms]:"+
						   "\nMath.pow:\t"+tMathPow+
						   "\npow for int:\t"+tPow+
						   "\nsquare:\t\t"+tSquare);
	}
}
Math.pow sollte nur dann benutzt werden, wenn man wirklich einen nicht-ganzzahligen exponenten hat. Für ganzzahlige Exponenten ist diese methode verschwenderischer Unsinn, denn dort wird zum einen der exponent in double übersetzt, und zum anderen ist die methode halbe stunde lang damit beschäftigt, die basis auf 20 nachkommastellen genau zu logarithmieren, um das ganze zusammen dann zu einem exponenten zu verwurschten. Zusätzlich werden etwa 15 verschiedene sonderfälle abgefragt, siehe die Liste.

Auf meinem rechner sehen die zeiten also wie folgt aus:
Code:
Benötigte Zeiten [ms]:
Math.pow:	4922
pow for int:	956
square:		177
dieses Math.pow ist also etwa 25 mal langsamer als einfaches quadrieren. Und
Java:
Math.pow(r,2)
ist ja wohl definitiv länger als
Java:
r*r
daher lohnt es sich erst recht nicht, ehrlich^^ 😉

Codeverlängerungsmaßnahmen wie
Java:
double pi=Math.PI;
sind übrigens auch nicht sehr effektiv :bae:
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Zurück
Oben