小菜求助: 麻烦各位达仁,看看这问题怎么解决。
以下用////////////////////////////////// 标明的地方与Rational 对象数组有关,编译可以通过, 但运行时候出现错误:Exception in thread "main" java.lang.NullPointerException 实在不知道为什么出这样的错,借各位达仁”慧眼“用用哦,先谢谢啦。
class Rational{
/**Rational类*/
private int m,d;
Rational(){
m=0;d=1;
}
Rational(int m_){
m=m_;d=1;
}
Rational(int m_,int d_){
if(d_==0){
System.out.println("\ndenomination is zero");
System.exit(0);
}
m=m_;d=d_;
}
private int GCD(){
int r,t1,t2;
t1=Math.abs(m);
t2=Math.abs(d);
if(t1<t2){
r=t1;t1=t2;t2=r;
}
r=t1%t2;
while(r!=0){
t1=t2;
t2=r;
r=t1%t2;
}
return t2;
}
private void lowest(){
int g;
if(m!=0){
g=this.GCD();
m/=g;
d/=g;
}
if(m<0&&d<0) {
m*=(-1);d*=(-1);
}
}
public void rationalSet(int m_,int d_){
m=m_;d=d_;
}
public Rational operate(Rational r2,char op){
Rational r=new Rational();
this.lowest();
r2.lowest();
switch(op){
case '+':r.m=this.m*r2.d+r2.m*this.d;r.d=this.d*r2.d;break;
case '-':r.m=this.m*r2.d-r2.m*this.d;r.d=this.d*r2.d;break;
case '*':r.m=this.m*r2.m;r.d=this.d*r2.d;break;
case '/':r.m=this.m*r2.d;r.d=this.d*r2.m;break;
}
r.lowest();
return r;
}
public boolean lessThan(Rational r){
Rational R;
R=this.operate(r,'-');
if((R.m^R.d)<0) return true;
return false;
}
public boolean greaterThan(Rational r){
Rational R;
R=this.operate(r,'-');
if((R.m^R.d)>0) return true;
return false;
}
public boolean equal(Rational r){
Rational R;
R=this.operate(r,'-');
if((R.m^R.d)==0) return true;
return false;
}
public boolean lessThanOrEqual(Rational r){
if(!this.greaterThan(r)) return true;
return false;
}
public boolean greaterThanOrEqual(Rational r){
if(!this.lessThan(r)) return true;
return false;
}
static Rational max(Rational r1, Rational r2){
if(r1.greaterThan(r2)) return r1;
return r2;
}
public String toString(){
return ("("+this.m+","+this.d+")");
}
}
public class Matrix{
/**在Rational 类上建立Matrix类。*/
private int r,c;
private Rational[] R;/////////////////////////////////
Matrix(){
r=1;c=1;
R=new Rational[r*c];
}
Matrix(int i,int j){
r=i;c=j;
R=new Rational[r*c];
}
private void matrixShow(){
for(int i=0;i<r;i++){
for(int j=0;j<c;j++)
System.out.print(R[i*c+j].toString()+" ");////////////////
System.out.print("\n");
}
}
private Matrix matrixAdd(Matrix m){
if(this.r!=m.r||this.c!=m.c){
System.out.println("Error:Size is not Match");
System.exit(0);
}
Matrix M=new Matrix(this.r,this.c);
for(int i=0;i<this.r;i++){
for(int j=0;j<this.c;j++)
M.R[i*M.c+j]=this.R[i*this.c+j].operate(m.R[i*m.c+j],'+');////////////
}
return M;
}
private Matrix matrixMul(Matrix m){
if(this.c!=m.r){
System.out.println("Error:Size is not Match");
System.exit(0);
}
Matrix M=new Matrix(this.r,m.c);
for(int i=0;i<this.r;i++)
for(int j=0;j<m.c;j++){
for(int k=0;k<this.c;k++)
M.R[i*M.c+j]=M.R[i*M.c+j].operate(this.R[i*this.c+k].operate(m.R[k*m.c+j],'*'),'+');/////////////
}
return M;
}
private void matrixRan(){//随机产生一个Matrix,但此处出错。原因未明。
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
R[i*c+j].rationalSet((int)(Math.random()*10),1);//////////////////////////
}
public static void main(String[] args){
Matrix obj1=new Matrix(2,2);
Matrix obj2=new Matrix(2,2);
Matrix obj;
obj1.matrixRan();
obj2.matrixRan();
obj1.matrixShow();
System.out.println("\n");
obj2.matrixShow();
System.out.println("\n");
obj=obj1.matrixAdd(obj2);
obj.matrixShow();
System.out.println("\n");
obj=obj1.matrixMul(obj2);
obj.matrixShow();
}
}