JAVA问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA问题相关的知识,希望对你有一定的参考价值。

绘制如下形式的图形界面,要求:窗体背景为蓝色,中间为黄色方格。
图片我不会弄,大体就是一个窗体是FrameWithPanel窗体里面是黑色的,里面有一个黄色方格。

这里直接把s赋值给readContent是有问题的,问题点如下:

假设文件有两行

第一行

第二行

则读取循环两次,第一次s赋值给readContent,readContent的值为 "第一行",然后又循环,读取第二行,再次赋值,则readContent就会变成 "第二行",第一行的值就丢失了;

这里StringBuff的作用是把读取到的内容连接起来成为一个字符串;

不过这里的例子的确有问题,问题却不在StringBuffer上,而在 s 变量上,s中间两步是不必要的,循环内直接改成如下形式:

删除s.getBytes()和new String

另外,除了以上问题,来总结下这段代码的问题吧:

1、文件资源没有释放

2、在不涉及多线程的情况下,应使用StringBuilder类进行字符串拼接,而不是StringBuffer,因为StringBuilder更快(但是StringBuilder线程不安全,StringBuffer线程安全);

3、异常处理有问题,如果出现IO异常,就返回异常信息的字符串?那么如何区分这个字符串是发生了异常还是从文件中读取到的内容呢?这里不应该返回字符串,而是直接声明异常,有异常就向外抛,直到能处理的顶层程序处理。

基于以上几点,修改代码如下:

注意第27行,声明本方法可能抛出 IOException 异常,稍后主程序将进行处理。另外注意第30行,创建InputStreamReader 的时候指定了文件编码为utf8,以避免乱码,你的文件如果存储的是其他编码类型,则会出现乱码。

调用代码如下:

getContent函数调用主程序

注意18行和21行,是分别处理正常情况和异常情况,当读取异常时,将会调用第21行,打印异常信息;

整体代码如下:

全部代码

接下来我们看看代码执行情况。

1、当我们要读的文件不存在时,执行结果如下:

我们要读的文件不存在时,抛出异常

看,当文件不存在时,抛出异常,并由异常处理程序捕获和打印,你可以看到具体哪一行代码出错[getContent(App.java:29)],说明在App.java 文件中的getContent方法,文件的29行出错。

2、那么正常情况下呢?当然是输出文件内容了,我们放一个有如下内容的文件在"D:\\\\file.txt"处:

要读取的文件内容

执行结果如下:

正常情况下,输出文件内容

最后,我不知道你看的是什么书,是不是课本,但感觉质量不高,这里给你推荐几本,可以买来看看:

1、Head First java

2、菜鸟教程 Java

3、最权威的,自然是The Java® Language Specificati了

祝你学习之路顺利

参考技术A import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.WindowConstants;

public class FrameWithPanel extends JFrame
public int width;
public int height;

@Override
public void paint(Graphics g)
// TODO Auto-generated method stub
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
width = this.getWidth();
height = this.getHeight();
g.setColor(Color.BLUE);
g.fill3DRect(0, 0, width, height, true);
g.setColor(Color.yellow);
g.fill3DRect(width / 4, height / 4, width / 2, height / 2, true);


public FrameWithPanel()



/**
* @param args
*/
public static void main(String[] args)
// TODO Auto-generated method stub
FrameWithPanel frme = new FrameWithPanel();
frme.setVisible(true);
frme.setSize(300, 200);


本回答被提问者采纳

【java】BufferedReader的问题

下面是我写的一个测试程序,如果不把Input1.close();屏蔽调的话,就无法输入Input2,报的错误是:
java.io.IOException: Stream closed
at java.io.BufferedInputStream.getBufIfOpen(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder$CharsetSD.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at test.main(test.java:33)
请问这是怎么回事啊?我第一个BufferedReader使用完后关闭,然后第二个BufferedReader是重新申请的啊?为什么第一个关闭了,第二个会提示Stream closed呢?
以下是我的程序test.java,请了解的朋友给解释一下,谢谢!
import java.io.*;

public class test
static int num;
static String str;
public static void main(String[] args)
try
System.out.print("Input number: ");
BufferedReader Input1 = new BufferedReader(new InputStreamReader(System.in));
num = Integer.parseInt(Input1.readLine());
Input1.close();//如果屏蔽该句则可以输入Input2

catch(IOException e1)
e1.printStackTrace();


try
System.out.print("Input string: ");
BufferedReader Input2 = new BufferedReader(new InputStreamReader(System.in));
str = Input2.readLine();
Input2.close();

catch(IOException e2)
e2.printStackTrace();


System.out.println("number = " + num + "\nString = " + str);

BufferedReader Input1 = new BufferedReader(new InputStreamReader(System.in));
BufferedReader Input2 = new BufferedReader(new InputStreamReader(System.in));
这两句话中的Input1和Input2都是由System.in封装而来。这是设计模式中的装饰模式的应用,顾名思义,装饰模式就是对最原始的东西进行装饰,只改变了外表,但实质并没有改变。System.in就是最原始的东西,Input1和Input2只是他被装饰后的外表,所以程序中的Input1和Input2的实质上都是System.in。调用Input1.close(),会自动调用Input1的实质System.in.close(),所以对于Input2来说他的实质System.in已经关闭掉,所以...
参考技术A 你关闭流最好做个finally 参考技术B 高手 但是我不明白为什么要关掉流呢

以上是关于JAVA问题的主要内容,如果未能解决你的问题,请参考以下文章

java问题

java 小问题

java问题

java实现日期排序问题

java问题

Java中String问题