[問題] 很奇怪的錯誤
我有一個程式,可以把分數化為最簡分數,
方法是在建立物件的時候利用建構元化為最簡。
我用 JCreator 進行程式碼撰寫,
在編譯的時候顯示成功,
但是在執行的時候卻出現以下錯誤:
java.lang.NoSuchMethodError : main
Exception in thread "main"
我其中有一行程式碼如下:
public static void main(String args[]) throws IOException
如果我先將最後面的 n 刪除,然後再打上一次 n,
很奇怪的,錯誤就不見,又可以正確執行了,
不曉得到底是哪裡有錯呢...?
我的完整程式碼如下,煩請各位幫忙
import java.io.*; /* 載入 java.io 類別庫內的所有類別 */
class Fraction /* 自定義的類別 Fraction */
{
private int numerator; /* 將資料設為 private */
private int denominator; /* 將資料設為 private */
public Fraction() /* 定義沒有引數的 constructor */
{
numerator=0;
denominator=1;
System.out.println("分數= "+numerator+"/"+denominator);
}
public Fraction(int n,int d) /* 定義有兩個引數的 constructor */
{
if(d>n) /* 分母大於分子 */
{
int i,j=0,k;
int cd_1[]=new int[50];
int gcd_1=1;
int n_1=n,d_1=d;
for(i=2;i<=n;i=i) /* 當迴圈執行完畢以後, */
{ /* cd_1 陣列裡面的所有元素相乘即是最大公因數 */
if((d%i==0)&&(n%i==0))
{
cd_1[j]=i;
j++;
d=d/i;
n=n/i;
}
else
i++;
}
for(k=0;k<j;k++) /* 迴圈執行完畢以後,gcd_1 即是兩數的最大公因數 */
{
gcd_1*=cd_1[k];
}
/*
將傳入的兩個引數(分子與分母)除以最大公因數,
所得到的數設定給 numerator 跟 denominator ,
如此就可以得到最簡分數
*/
numerator=n_1/gcd_1;
denominator=d_1/gcd_1;
}
else if(d==n) /* 分子等於分母 */
{
numerator=n/n;
denominator=d/d;
}
else if(n>d) /* 分子大於分母 */
{
/* 與上面分母大於分子的演算法相同 */
int i,j=0,k;
int cd_2[]=new int[50];
int gcd_2=1;
int n_2=n,d_2=d;
for(i=2;i<=n;i=i)
{
if((d%i==0)&&(n%i==0))
{
cd_2[j]=i;
j++;
d=d/i;
n=n/i;
}
else
i++;
}
for(k=0;k<j;k++)
{
gcd_2*=cd_2[k];
}
numerator=n_2/gcd_2;
denominator=d_2/gcd_2;
}
System.out.println(numerator+"/"+denominator);
}
public int num() /* 可傳回分子 */
{
return numerator;
}
public int den() /* 可傳回分母 */
{
return denominator;
}
}
public class Fract
{
public static void main(String args[]) throws IOException
{
BufferedReader buf;
String str1,str2,str3,str4;
int num1,num2,num3,num4;
buf=new BufferedReader(new InputStreamReader(System.in));
/* 讓使用者分別輸入兩個分數的分子與分母 */
System.out.print("請輸入第一個分數的分子: ");
str1=buf.readLine();
num1=Integer.parseInt(str1);
System.out.print("請輸入第一個分數的分母: ");
str2=buf.readLine();
num2=Integer.parseInt(str2);
System.out.println();
System.out.print("化為最簡後,第一個分數= ");
Fraction obj1=new Fraction(num1,num2); /* 建立 obj1 物件,
利用 constructor 輸出最簡分數
*/
System.out.println();
System.out.print("請輸入第二個分數的分子: ");
str3=buf.readLine();
num3=Integer.parseInt(str3);
System.out.print("請輸入第二個分數的分母: ");
str4=buf.readLine();
num4=Integer.parseInt(str4);
System.out.println();
System.out.print("化為最簡後,第二個分數= ");
Fraction obj2=new Fraction(num3,num4); /* 建立 obj2 物件,
利用 constructor 輸出最簡分數
*/
System.out.println();
System.out.println();
System.out.println("---------------(a)---------------");
System.out.print("兩者相加以後,分數= ");
/* 建立 add 物件,並且把通分以後的分子與分母當作引數傳入 */
Fraction add=new Fraction(num1*num4+num2*num3,num2*num4);
System.out.println();
System.out.println();
System.out.println("---------------(b)---------------");
System.out.print("兩者相乘以後,分數= ");
/* 建立 multiply 物件,並且把相乘以後的分子與分母當作引數傳入 */
Fraction multiply=new Fraction(num1*num3,num2*num4);
System.out.println();
System.out.println();
System.out.println("---------------(c)---------------");
System.out.print("(a)= "+add.num()+"/"+add.den());
System.out.println(", (b)= "+multiply.num()+"/"+multiply.den());
System.out.println();
System.out.println();
System.out.println("---------------(d)---------------");
System.out.println("Floating-point format:");
/*
利用 (float) 將分子轉為 float 型態,
計算 float型態除以int型態時,編譯器會將int型態轉為float型態
因此只要將分子轉成float型態,就可以將整個運算的結果轉成float型態
*/
System.out.printf("(a)= %f, (b)= %f
\n\n",(float)add.num()/add.den(),(float)multiply.num()/multiply.den());
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.120.222.46
※ 編輯: thnestar 來自: 140.120.222.46 (03/28 18:47)
→
03/28 19:39, , 1F
03/28 19:39, 1F
推
03/28 19:48, , 2F
03/28 19:48, 2F
推
03/28 19:48, , 3F
03/28 19:48, 3F
→
03/28 20:52, , 4F
03/28 20:52, 4F
→
03/28 21:36, , 5F
03/28 21:36, 5F
→
03/28 22:06, , 6F
03/28 22:06, 6F
→
03/31 21:37, , 7F
03/31 21:37, 7F