字符串比较时空指针异常

当我们在写代码时,经常会犯如下的错误:

例如,我们要解析一个XML文档,

book.xml 如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<书架>
<书>
<书名 >java</书名>
<作者>作者1</作者>
<售价>234242</售价>
</书>
<书>
<书名>java web</书名>
<作者>作者2</作者>
<售价>120</售价>
</书>
</书架>

我们利用junit进行单元测试

代码如下为使用SAX进行XML 解析,并且将解析出来的一个个书的对象,封装到Book对象当中,形成一个List集合返回

首先,Book的javabean实现如下:主要是封装书的信息

package com.sax;


public class Book {
private String bookName;
private String author;
private double price;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}

}

SAX解析如下:

package com.sax;


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;


import org.junit.Test;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;


public class Demo3 {
/**
* @throws ParserConfigurationException
* @throws SAXException
* @throws IOException
*/
@Test
public void test() throws ParserConfigurationException, SAXException, IOException {
// 1.创建解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2.得到解析器
SAXParser sp = factory.newSAXParser();
// 3.得到读取器
XMLReader reader = sp.getXMLReader();


// 4.设置内容读取器
BeanListHandler handler=new BeanListHandler();
reader.setContentHandler(handler);
// 5.读取XML文档内容
reader.parse("src/book.xml");
List<Book> list=handler.getList();
System.out.println(list);
}
}
//封装成对象 返回
class BeanListHandler extends DefaultHandler{
private List<Book> list=new ArrayList<Book>();
private String currentTag;
private Book book;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
currentTag=qName;
if("书".equals(currentTag)){
book=new Book();
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if("书名".equals(currentTag)){
book.setBookName(new String(ch,start,length));
}
if("作者".equals(currentTag)){
book.setAuthor((new String(ch,start,length)));
}
if("售价".equals(currentTag)){
book.setPrice(Double.parseDouble((new String(ch,start,length))));
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if("书".equals(qName)){
list.add(book);
book=null;//置空
}
currentTag=null;
}
public List<Book> getList() {
return list;
}

}

我们常常犯的错误是把:

if("书名".equals(currentTag)){
book.setBookName(new String(ch,start,length));
}
if("作者".equals(currentTag)){
book.setAuthor((new String(ch,start,length)));
}
if("售价".equals(currentTag)){
book.setPrice(Double.parseDouble((new String(ch,start,length))));
}

写成:

if(currentTag.equals("书名")){
book.setBookName(new String(ch,start,length));
}
if(currentTag.equals("作者")){
book.setAuthor((new String(ch,start,length)));
}
if(currentTag.equals("售价")){
book.setPrice(Double.parseDouble((new String(ch,start,length))));
}

会报空指针异常

因为当读取到XML文档的结束标签的时候,会设置currentTag为空,所以此时,会读取</书名>之后的空白也就是</书名>    <作者>之间的空白部分,因此会执行,characters函数,从而执行if(currentTag.equals("书名")){
book.setBookName(new String(ch,start,length));
}

也就是说判断 null.equals("书名")因此会报错。


题目描述 在雾之湖畔红色洋馆的地下图书室中, Patchouli 正在操纵名为「七曜元素秘典」的魔法卷轴构建法术序列。这个装置通过悬浮的符文阵列储存七种元素之力,每个符文的能量印记对应现代计算机中的字符编码。 秘典规则 秘法操作 指令格式 功能描述 锚定 Anchor k 将编织指针固定到第 kk 个符文后方( k=0k=0 时锚定到阵列起始) 召唤 Summon n s 在指针处召唤符文 ss ,总长度为 nn 湮灭 Annihilate n 抹除指针后方 nn 个符文的能量印记 显现 Manifest n 将指针后方 nn 个符文的能量印记具现化 溯流 Rewind 指针逆流回溯一个符文位 涌进 Surge 指针顺流前进一个符文位 模拟任务 初始化空白卷轴 解析 Patchouli 的秘法操作 将「显现」结果刻录至元素秘典 输入格式 第一行为秘法操作总数 tt; 每个 Summon 操作中的 ss 可能包含可见字符( ASCIIsi∈[32,126]ASCIIsi​​∈[32,126] )或者换行符 (\n)。换行符仅为提高可读性,执行指令时忽略 \n 。 保证所有操作参数合法(无需处理异常输入)。 输出格式 每行依次对应 Manifest 指令具现得到的符文。 样例 输入 9 Summon 13 Balanc ed eert Anchor 2 Annihilate 5 Surge Summon 7 1919810 Anchor 0 Manifest 15 Anchor 11 Manifest 3 输出 Bad1919810 eert eer 数据范围 Anchor 操作不超过 5000050000 次; Summon 与 Annihilate 操作总数不超过 40004000 次; 时空回溯( Rewind / Surge )总次数不超过 200000200000 次; 所有 Summon 操作注入的符文总数不超过 22 Mb (2×1024×10242×1024×1024 字节); Manifest 结果的总长度不超过 33 Mb; 湮灭与显现操作执行时指针后方必有足够符文; 所有指针移动操作不会越界。 对新手魔法使的忠告: 需要处理的 I/O 流规模较大,建议关闭同步流 Hint: 时空磁盘限制(运行时) 时间限制:200 ms 内存空间限制:244 MiB 磁盘空间限制:不可使用磁盘 分析这道题并给出几个测试数据
最新发布
03-12
VideoMAE V2是一种用于视频Transformer预训练的简单且高效的自监督学习方法。它引入了极高掩码率和tube掩码策略两种关键设计,使视频重建任务更具挑战性,并缓解信息泄漏问题。实验结果表明,VideoMAE V2适用于不同规模的视频数据集,并且只需数千个视频片段就可以得到有效的结果,对于数据有限的场景具有重要的实用价值。\[2\] #### 引用[.reference_title] - *1* [【Paper】复现VideoMAE](https://blog.youkuaiyun.com/m0_51371693/article/details/131408101)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [VideoMAE:掩码自编码器是用于自监督视频预训练的高效利用数据的学习者](https://blog.youkuaiyun.com/weixin_51697828/article/details/125117105)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [文章阅读VideoMAE: Masked Autoencoders are Data-Efficient Learners for Self-Supervised Video Pre-...](https://blog.youkuaiyun.com/qq_42740834/article/details/129363049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值