我正在制作一个程序,将给定的整数减少到最简单的比例。但是在程序的子方法中通过Scanner类获取输入时发生错误。这是代码:
package CodeMania;
import java.util.Scanner;
public class Question5
{
public static void main(String args[])
{
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();// number of test cases
sc.close();
if(T<1)
{
System.out.println("Out of range");
System.exit(0);
}
for(int i=0;i<T;i++)
{
ratio();//line 19
}
}
static void ratio()
{
Scanner sc1=new Scanner(System.in);
int N=sc1.nextInt();//line 26
if((N>500)||(N<1))
{
System.out.println("Out of range");
System.exit(0);
}
int a[]=new int[N];
for(int i=0;i<N;i++)
{
a[i]=sc1.nextInt();
}
int result = a[0];
for(int i = 1; i < a.length; i++)
{
result = gcd(result, a[i]);
}
for(int i=0;i<N;i++)
{
System.out.print((a[i]/result)+" ");
}
sc1.close();
}
static int gcd(int a, int b)
{
while (b > 0)
{
int temp = b;
b = a % b;
a = temp;
}
return a;
}
}
错误是 -
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at CodeMania.Question5.ratio(Question5.java:26)
at CodeMania.Question5.main(Question5.java:19)
这里我在主函数中使用了2个单独的扫描仪对象sc,在比率函数中使用了sc1来从控制台获取输入。 但是,如果我在类范围内声明一个公共静态类型Scanner对象,然后在整个程序中只使用一个Scanner对象来获取输入,那么程序可以根据需要正常工作而不会出错。
为什么会发生这种情况......?
答案 0 :(得分:5)
出现此错误的原因是在扫描程序上调用.close()也会关闭inputStream System.in ,但实例化新扫描程序不会重新打开它。
您需要在方法参数中传递单个扫描程序,或使其成为静态全局变量。
答案 1 :(得分:0)
由于您的main()
和ratio()
方法正在使用扫描程序,它们会抛出异常,当发生异常时,程序的正常流程中断并且程序/应用程序异常终止,这是不推荐的,因此要处理这些例外情况。
出现异常可能有很多种原因,下面给出了发生异常的一些情况。
A user has entered invalid data.
A file that needs to be opened cannot be found.
A network connection has been lost in the middle of communications or the JVM has run out of memory.
您可以使用 Try / Catch 块来处理这些例外,或者您可以在方法定义后使用 throws 来处理它们, 在你的情况下,这两种方法将是这样的:
使用Try / Catch :
public static void main()
{
try{
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();// number of test cases
sc.close();
}
catch(NoSuchElementException e){
System.out.print("Exception handled" + e);
//rest of method
}
static void ratio(){
try{
Scanner sc1=new Scanner(System.in);
int N=sc1.nextInt();}
catch(NoSuchElementException e){
System.out.print("Exception handled" + e);}
//rest of method
}
“投掷”:
public static void main()throws Exception{
//rest of method
}
static void ratio()throws Exception
{
//rest of method
}
答案 2 :(得分:0)
试试这个。您可以将扫描仪作为参数传递
package stack.examples;
import java.util.Scanner;
public class Question5 {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();// number of test cases
if (T < 1) {
System.out.println("Out of range");
System.exit(0);
}
for (int i = 0; i < T; i++) {
ratio(sc);// line 19
}
sc.close();
}
static void ratio(Scanner sc1) {
int N = sc1.nextInt();// line 26
//Your Logic
}
static int gcd(int a, int b) {
while (b > 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
}
答案 3 :(得分:0)
import java.util.*;
public class Understanding_Scanner
{
public static void main()
{
Scanner sc= new Scanner(System.in);
System.out.println("Please enter your name");
String name=sc.next();
System.out.println("Your name is:"+name);
}
}
现在解释这个问题所以我们必须从Java Utility包中导入一个扫描器类,这样就可以通过第一行的代码来实现 第二行是创建一个类注意(类的名称不需要以资本开始)现在进入主题Scanner类,所以我们必须在程序中用代码创建一个扫描器类这是在第4行中给出的...在这个语句中'sc'是一个存储扫描器类值的对象,所以如果你想在扫描器类中进行任何操作,你可以通过对象'sc'来完成它注意(你可以将你的对象命名为任何东西,例如:poop,bla等)...... 然后我们有这个有趣的命令,说System.in现在这允许用户在运行时通过键盘或任何这样的输入设备写任何语句.... String name = sc.next()这一行帮助我们编写我们想要在运行时写入的任何字符串,它将存储在名称变量中
就是这样,这是你的扫描仪类。希望它易于理解。
欢呼声!!继续编码: - )