Java代码处缓冲区中的意外值
Deitele书中的简单程序,读取5个整数,程序应打印包含该数量的相邻星号的行。即(如果num=5,则输出*****)。 我已经在C++中测试了同样的解决方案,而且效果不错。然而,这里的缓冲区保存着奇怪的值(50?)。 我认为问题在于使用缓冲区,但是我想知道为什么会发生这种情况Java代码处缓冲区中的意外值,java,Java,Deitele书中的简单程序,读取5个整数,程序应打印包含该数量的相邻星号的行。即(如果num=5,则输出*****)。 我已经在C++中测试了同样的解决方案,而且效果不错。然而,这里的缓冲区保存着奇怪的值(50?)。 我认为问题在于使用缓冲区,但是我想知道为什么会发生这种情况 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication1;
import java.io.*;
import java.util.Date;
/**
* Program that reads five numbers and print starts equal to each number
*
* @author Hassan
*/
public class JavaApplication1
{
public static void main(String[] args)
{
int num ;
java.io.InputStreamReader ins= new InputStreamReader(System.in);
java.io.BufferedReader bfr = new BufferedReader (ins);
try
{
for(int i=0;i<5;i++)
{
System.out.println("Please Enter a number");
num = bfr.read();
System.out.print(num);
for(int j=0;j<num;j++)
{ System.out.print("* "); }
System.out.println("\n");
}
}
catch(Exception E )
{System.out.println(E.getMessage()); }
}
}
/*
*要更改此模板,请选择工具|模板
*然后在编辑器中打开模板。
*/
包javaapplication1;
导入java.io.*;
导入java.util.Date;
/**
*读取五个数字并按每个数字开始打印的程序
*
*@作者哈桑
*/
公共类JavaApplication1
{
公共静态void main(字符串[]args)
{
int-num;
java.io.InputStreamReader ins=新的InputStreamReader(System.in);
java.io.BufferedReader bfr=新的BufferedReader(ins);
尝试
{
对于(int i=0;i您的代码未编译:
使用/
而不是\\
您的花括号未对齐,这会造成混淆并可能导致错误
写评论时,请确保在新行中关闭括号(否则它就是评论的一部分)
解决这三个问题,你的程序就会工作
更新:
JasonD是对的,改变:
num = bfr.read();
致:
原因是你在读一个字符,ascii中的“0”是48,“1”是49等等,所以如果你希望输入的范围是0-9,你应该减去48,这样就行了
如果要处理大于9的数字,则必须使用readLine()
并解析输入的字符串您正在读取一个字节,该字节将只是第一个可用字符的ascii值。50在ascii中为“2”。您可能要读取并解析作为文本输入的数字
如果使用readLine()
而不是read()
,将其转换为字符串
,则可以使用Integer.parseInt()
获取实际值。也许我只是在复制代码时错误地格式化了代码,因为它是在NetBeans上编译和工作的。我会编辑它now@HSN修复这三个问题使它在我的机器上编译和运行,首先阅读BufferedReader和INPtWruter-Read类。你可以考虑它打开一个“插入管道”,在那里你可以“插入”。一些数据(在您的int类型示例中)。如果数据读取错误,则会捕获异常,我认为在您的示例中更正确的是IOException类。E是exception类的实例,getMessage()是是此类的一个方法。但是,在现代方法中,您使用Scanner类从键盘输入不同类型的数据。@PhilipWhitehouse是的,那:)@HSN这似乎是一个新问题。以下是您的代码版本,其中包含建议的更改,似乎有效:
num = bfr.read()-48;