我无法理解为什么我在main中的数组初始化中遇到错误。我删除了一个变量t并从键盘中取出了它的值。但是当我尝试初始化一个大小为t的数组n []时,它会显示一个error.plz help
import java.io.*;
import java.math.BigInteger;
class smallfac
{
static BigInteger fac(BigInteger x)
{
BigInteger z;
if(x.equals(new BigInteger("1")))
return x;
else
{
z=x.multiply(fac(x.subtract(new BigInteger("1"))));
return(z);
}
}
public static void main(String args[])
{
InputStreamReader in=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(in);
try{
int t=Integer.parseInt(br.readLine());
}catch(IOException e){}
int[] n=new int[t];
for(int i=0;i<n.length;i++)
{
try
{
n[i]=Integer.parseInt(br.readLine());
}catch(IOException e){}
}
for(int i=0;i<n.length;i++)
{
int x=n[i];
BigInteger p = new BigInteger(Integer.toString(x));
p=smallfac.fac(p);
System.out.println(p);
}
}
}
答案 0 :(得分:4)
这是一个范围问题。您在int t
块内声明try
,但之后尝试使用t
之后的值,这是不可能的; t
仅在try
内可见。
答案 1 :(得分:2)
我看到一些问题:
try{
int t=Integer.parseInt(br.readLine());
}catch(IOException e){}
int[] n=new int[t];
那里有两个问题:
t
仅在try
块中声明。它超出了该区域之外的范围。因此,尝试在上面的最后一行使用t
时出现编译时错误。
即使您通过在块外声明t
然后在块内初始化它来修复它,编译器也无法确定t
是否具有从最后一行开始的值以上。可能会抛出异常。所以这是一个错误(编译时错误)。
后者,第三个问题(至少):
for(int i=0;i<n.length;i++)
{
try
{
n[i]=Integer.parseInt(br.readLine());
}catch(IOException e){}
}
这是一个逻辑错误。如果您尝试在后续循环中使用n[i]
,则不知道n[i]
是否已实际初始化,因为您已隐藏了异常。尽管如此,有一个I / O异常初始化n[2]
,因此n[2]
保留默认的null
值。如果您稍后尝试使用它而不检查,则会获得NullPointerException
。
捕获和忽略异常是一个非常糟糕的主意,特别是针对特定代码行重复执行此操作。
以下是main
的最小修改:
public static void main(String args[])
{
// Put all the code in one try block
try {
InputStreamReader in=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(in);
int t=Integer.parseInt(br.readLine());
int[] n=new int[t];
for(int i=0;i<n.length;i++)
{
n[i]=Integer.parseInt(br.readLine());
}
for(int i=0;i<n.length;i++)
{
int x=n[i];
BigInteger p = new BigInteger(Integer.toString(x));
p=smallfac.fac(p);
System.out.println(p);
}
}catch(IOException e){
// Report the error here
}
}
答案 2 :(得分:0)
int[] n=new int[t];
&lt; - 此处t
必须在范围内定义。你可以把它改成:
int t = 0;//or some default value
try{
t=Integer.parseInt(br.readLine());
}catch(IOException e){}
int[] n=new int[t];
答案 3 :(得分:0)
t
在 try-block 中定义。因此范围是limited to try block
。你不能在try block之外访问它。在try之外定义它,这样你的数组初始化就可以访问它了