精华内容
下载资源
问答
  • 1. 前言如果你没有处理过空指针,那么你不是...这是你可能会想,这报错很好处理,然后你看了眼报错行数,对比了下代码。脑海里瞬间闪过 ”对对对,这里有可能为空“,然后加上null check轻松处理。然而你不知道这已...

    1. 前言

    如果你没有处理过空指针,那么你不是一位真正的 Java 程序员。

    空指针确实会产生很多问题,我们经常遇到空的引用,然后又想从这个空的引用上去获取其他的值,接着理所当然的碰到了 NullPointException。这是你可能会想,这报错很好处理,然后你看了眼报错行数,对比了下代码。脑海里瞬间闪过 ”对对对,这里有可能为空“,然后加上 null check轻松处理。然而你不知道这已经是你处理的第多少个空指针异常了。

    为了解决上面的问题,在 Java SE8 中引入了一个新类 java.util.Optional,这个类可以缓解上面的问题。

    你可能已经发现了,上面我用的是缓解而不是解决。这也是很多人理解不太对的地方,以为 Java SE8 中的 Optional 类可以解决空指针问题。其实 Optional 类的的使用只是提示你这里可能存在空值,需要特殊处理,并提供了一些特殊处理的方法。如果你把 Optional 类当作空指针的救命稻草而不加思考的使用,那么依旧会碰到错误。

    因为 Optional 是的 Java SE8 中引入的,因此本文中难免会有一些 JDK8 中的语法,如 Lambda 表达式,流处理等,但是都是基本形式,不会有过于复杂的案例。

    2. Optional 创建

    Optional 的创建一共有三种方式。

    /**
     * 创建一个 Optional
     */

    @Test
    public void createOptionalTest() {
        // Optional 构造方式1 - of 传入的值不能为 null
        Optional helloOption = Optional.of("hello");// Optional 构造方式2 - empty 一个空 optional
        Optional emptyOptional = Optional.empty();// Optional 构造方式3 - ofNullable 支持传入 null 值的 optional
        Optional nullOptional = Optional.ofNullable(null);
    }

    其中构造方式1中 of 方法,如果传入的值会空,会报出 NullPointerException 异常。

    3. Optional 判断

    Optional 只是一个包装对象,想要判断里面有没有值可以使用 isPresent 方法检查其中是否有值 。

    /**
     * 检查是否有值
     */

    @Test
    public void checkOptionalTest() {
        Optional helloOptional = Optional.of("Hello");
        System.out.println(helloOptional.isPresent());
        Optional emptyOptional = Optional.empty();
        System.out.println(emptyOptional.isPresent());
    }

    得到的输出:

    true
    false

    从 JDK11 开始,提供了 isEmpty方法用来检查相反的结果:是否为空。

    如果想要在有值的时候进行一下操作。可以使用 ifPresent方法。

    /**
     * 如果有值,输出长度
     */

    @Test
    public void whenIsPresent() {
        // 如果没有值,获取默认值
        Optional helloOptional = Optional.of("Hello");
        Optional emptyOptional = Optional.empty();
        helloOptional.ifPresent(s -> System.out.println(s.length()));
        emptyOptional.ifPresent(s -> System.out.println(s.length()));
    }

    输出结果:

    5

    4. Optional 获取值

    使用 get方法可以获取值,但是如果值不存在,会抛出 NoSuchElementException 异常。

    /**
     * 如果没有值,会抛异常
     */

    @Test
    public void getTest() {
        Optional stringOptional = Optional.of("hello");
        System.out.println(stringOptional.get());// 如果没有值,会抛异常
        Optional emptyOptional = Optional.empty();
        System.out.println(emptyOptional.get());
    }

    得到结果:

    hello

    java.util.NoSuchElementException: No value present
        at java.util.Optional.get(Optional.java:135)
        at net.codingme.feature.jdk8.Jdk8Optional.getTest(Jdk8Optional.java:91)

    5. Optional 默认值

    使用 orElseorElseGet 方法可以在没有值的情况下获取给定的默认值。

    /**
     * 如果没有值,获取默认值
     */

    @Test
    public void whenIsNullGetTest() {
        // 如果没有值,获取默认值
        Optional emptyOptional = Optional.empty();
        String orElse = emptyOptional.orElse("orElse default");
        String orElseGet = emptyOptional.orElseGet(() -> "orElseGet default");
        System.out.println(orElse);
        System.out.println(orElseGet);
    }

    得到的结果:

    orElse default
    orElseGet default

    看到这里你可能会有些疑惑了,这两个方法看起来效果是一模一样的,为什么会提供两个呢?下面再看一个例子,你会发现两者的区别。

     /**
     * orElse 和 orElseGet 的区别
     */

    @Test
    public void orElseAndOrElseGetTest() {
        // 如果没有值,默认值
        Optional emptyOptional = Optional.empty();
        System.out.println("空Optional.orElse");
        String orElse = emptyOptional.orElse(getDefault());
        System.out.println("空Optional.orElseGet");
        String orElseGet = emptyOptional.orElseGet(() -> getDefault());
        System.out.println("空Optional.orElse结果:"+orElse);
        System.out.println("空Optional.orElseGet结果:"+orElseGet);
        System.out.println("--------------------------------");// 如果没有值,默认值
        Optional stringOptional = Optional.of("hello");
        System.out.println("有值Optional.orElse");
        orElse = stringOptional.orElse(getDefault());
        System.out.println("有值Optional.orElseGet");
        orElseGet = stringOptional.orElseGet(() -> getDefault());
        System.out.println("有值Optional.orElse结果:"+orElse);
        System.out.println("有值Optional.orElseGet结果:"+orElseGet);
    }public String getDefault() {
        System.out.println("   获取默认值中..run getDeafult method");return "hello";
    }

    得到的输出:

    空Optional.orElse
       获取默认值中..run getDeafult method
    空Optional.orElseGet
       获取默认值中..run getDeafult method
    空Optional.orElse结果:hello
    空Optional.orElseGet结果:hello
    --------------------------------
    有值Optional.orElse
       获取默认值中..run getDeafult method
    有值Optional.orElseGet
    有值Optional.orElse结果:hello
    有值Optional.orElseGet结果:hello

    在这个例子中会发现 orElseGet 传入的方法在有值的情况下并不会运行。而 orElse却都会运行。

    6. Optional 异常

    使用 orElseThrow 在没有值的时候抛出异常

    /**
     * 如果没有值,抛出异常
     */

    @Test
    public void whenIsNullThrowExceTest() throws Exception {
        // 如果没有值,抛出异常
        Optional emptyOptional = Optional.empty();
        String value = emptyOptional.orElseThrow(() -> new Exception("发现空值"));
        System.out.println(value);
    }

    得到结果:

    java.lang.Exception: 发现空值
        at net.codingme.feature.jdk8.Jdk8Optional.lambda$whenIsNullThrowExceTest$7(Jdk8Optional.java:118)
        at java.util.Optional.orElseThrow(Optional.java:290)
        at net.codingme.feature.jdk8.Jdk8Optional.whenIsNullThrowExceTest(Jdk8Optional.java:118)

    7. Optional 函数接口

    Optional 随 JDK8 一同出现,必然会有一些 JDK8 中的新特性,比如函数接口。Optional 中主要有三个传入函数接口的方法,分别是filtermapflatMap。这里面的实现其实是 JDK8 的另一个新特性了,因此这里只是简单演示,不做解释。后面放到其他 JDK8 新特性文章里介绍。

    @Test
    public void functionTest() {
        // filter 过滤
        Optional optional123 = Optional.of(123);
        optional123.filter(num -> num == 123).ifPresent(num -> System.out.println(num));
        Optional optional456 = Optional.of(456);
        optional456.filter(num -> num == 123).ifPresent(num -> System.out.println(num));// map 转换
        Optional optional789 = Optional.of(789);
        optional789.map(String::valueOf).map(String::length).ifPresent(length -> System.out.println(length));
    }

    得到结果:

    123
    3

    8. Optional 案例

    假设有计算机、声卡、usb 三种硬件(下面的代码中使用了 Lombok 的 @Data 注解)。

    /**
     * 计算机
     */

    @Data
    class Computer {
        private Optional soundCard;
    }/**
     * 声卡
     */
    @Dataclass SoundCard {private Optional usb;
    }/**
     * USB
     */
    @Dataclass Usb {private String version;
    }

    计算机可能会有声卡,声卡可能会有 usb。那么怎么取得 usb 版本呢?

    /**
     * 电脑里【有可能】有声卡
     * 声卡【有可能】有USB接口
     */

    @Test
    public void optionalTest() {
        // 没有声卡,没有 Usb 的电脑
        Computer computerNoUsb = new Computer();
        computerNoUsb.setSoundCard(Optional.empty());
        // 获取 usb 版本
        Optional computerOptional = Optional.ofNullable(computerNoUsb);
        String version = computerOptional.flatMap(Computer::getSoundCard).flatMap(SoundCard::getUsb)
            .map(Usb::getVersion).orElse("UNKNOWN");
        System.out.println(version);
        System.out.println("-----------------");// 如果有值,则输出
        SoundCard soundCard = new SoundCard();
        Usb usb = new Usb();
        usb.setVersion("2.0");
        soundCard.setUsb(Optional.ofNullable(usb));
        Optional optionalSoundCard = Optional.ofNullable(soundCard);
        optionalSoundCard.ifPresent(System.out::println);// 如果有值,则输出if (optionalSoundCard.isPresent()) {
            System.out.println(optionalSoundCard.get());
        }// 输出没有值,则没有输出
        Optional optionalSoundCardEmpty = Optional.ofNullable(null);
        optionalSoundCardEmpty.ifPresent(System.out::println);
        System.out.println("-----------------");// 筛选 Usb2.0
        optionalSoundCard.map(SoundCard::getUsb)
                .filter(usb1 -> "3.0".equals(usb1.map(Usb::getVersion)
                .orElse("UBKNOW")))
                .ifPresent(System.out::println);
    }

    得到结果:

    UNKNOWN
    -----------------
    SoundCard(usb=Optional[Usb(version=2.0)])
    SoundCard(usb=Optional[Usb(version=2.0)])
    -----------------

    9. Optional 总结

    在本文中,我们看到了如何使用 Java SE8 的 java.util.Optional 类。Optional 类的目的不是为了替换代码中的每个空引用,而是为了帮助更好的设计程序,让使用者可以仅通过观察属性类型就可以知道会不会有空值。另外,Optional不提供直接获取值的方法,使用时会强迫你处理不存在的情况。间接的让你的程序免受空指针的影响。

    文中代码已经上传 Github:https://github.com/niumoo/jdk-feature

    推荐阅读

    (点击标题可跳转阅读)

    夯实Java基础系列16:一文读懂Java IO流和常见面试题

    夯实Java基础系列15:Java注解简介和最佳实践

    夯实Java基础系列14:深入理解Java枚举类

    夯实Java基础系列11:深入理解Java中的回调机制

    夯实Java基础系列10:深入理解Java中的异常体系

    夯实Java基础系列9:深入理解Class类和Object类

    夯实Java基础系列8:深入理解Java内部类及其实现原理

    夯实Java基础系列7:一文读懂Java 代码块和代码执行顺序

    一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!

    一文读懂 Java 文件和包结构,解读开发中常用的 jar 包

    一文了解 final 关键字的特性、使用方法以及实现原理

    5b61eb2bd5086219c228836b55b14e0a.png

    点个“在看”,转发朋友圈,都是对我最好的支持!
    展开全文
  • 案例:有时候我们需要把自己捕获的异常,保存下来 那么就要精确的定位到哪一行报错public static StringBuffer getTraceInfo(Exception e) {StringBuffer sb = new StringBuffer();StackTraceElement[] stacks = e....

    案例:

    有时候我们需要把自己捕获的异常,保存下来 那么就要精确的定位到哪一行报错

    public static StringBuffer getTraceInfo(Exception e) {

    StringBuffer sb = new StringBuffer();

    StackTraceElement[] stacks = e.getStackTrace();

    for (int i = 0; i < stacks.length; i++) {

    if (stacks[i].getClassName().contains(this.getApplicaionName)) {

    sb.append("class: ").append(stacks[i].getClassName())

    .append("; method: ").append(stacks[i].getMethodName())

    .append("; line: ").append(stacks[i].getLineNumber())

    .append("; Exception: ");

    break;

    }

    }

    return sb;

    }

    public static String getExceptionMessage(Exception e) {

    String message = e.toString();

    if (message.lastIndexOf(":") != -1)

    message = message.substring(0, message.lastIndexOf(":"));

    return getTraceInfo(e).append(message).toString();

    }

    展开全文
  • importjava.util.*;publicclassthreeone{publicvoidyh(intx)//x为行数{Stringa[][]=newString[x][x];inti,temp=0,j;for(i=0;iimport java.util.*;public class threeone{public void yh(int x)//x为行数{String a[]...

    importjava.util.*;publicclassthreeone{publicvoidyh(intx)//x为行数{Stringa[][]=newString[x][x];inti,temp=0,j;for(i=0;i

    import java.util.*;

    public class threeone

    {

    public void yh(int x)//x为行数

    {

    String a[][]=new String[x][x];

    int i,temp=0,j;

    for(i=0;i

    {

    a[0][i]=" ";

    }

    a[0][x/2]="1";

    for(i=1;i

    {

    for(temp=0;temp

    {

    if((a[i][temp+1]=="1")||(a[i][temp-1]=="1"))

    {

    a[i][temp]=" ";

    }

    else

    a[i][temp]="1";

    }

    }

    for(i=0;i

    {

    for(temp=0;temp

    {

    System.out.print(a[i][temp]);

    }

    System.out.print("\n");

    }

    }

    public static void main(String[] args)

    {

    int x=6;

    String a[][]=new String[x][x];

    int i,temp=0,j;

    for(i=0;i

    {

    a[0][i]=" ";

    }

    a[0][x/2]="1";

    for(i=1;i

    {

    for(temp=1;temp

    {

    if((a[i][temp+1]=="1")||(a[i][temp-1]=="1"))

    {

    a[i][temp]="1";

    }

    else

    a[i][temp]=" ";

    }

    }

    for(i=0;i

    {

    for(temp=0;temp

    {

    System.out.print(a[i][temp]);

    }

    System.out.print("\n");

    }

    }

    }

    为什么那个if((a[i][temp+1]=="1")||(a[i][temp-1]=="1"))会报错??

    展开

    展开全文
  • java命令行参数这一部分时,我运行hello world在命令行里是可以正常运行的。但是运行如下程序: public class TestMain { public static void main(String[ ] args){ if(args.length==0) //没有向命令行输入参数...
  • 作者:达西出自:微信公众号“未读代码”原文:Jdk14都要出了,还不能使用 Optional优雅的处理空指针?1. 前言如果你没有处理过空指针,...这是你可能会想,这报错很好处理,然后你看了眼报错行数,对比了下代码。...

    05bb6f5ea5987d3e96f1a957fa1aaa25.png

    作者:达西

    出自:微信公众号“未读代码”

    原文:Jdk14都要出了,还不能使用 Optional优雅的处理空指针?

    71495dd399516404e5efce01b52ede08.png

    1. 前言

    如果你没有处理过空指针,那么你不是一位真正的 Java 程序员。

    空指针确实会产生很多问题,我们经常遇到空的引用,然后又想从这个空的引用上去获取其他的值,接着理所当然的碰到了 NullPointException。这是你可能会想,这报错很好处理,然后你看了眼报错行数,对比了下代码。脑海里瞬间闪过 ”对对对,这里有可能为空“,然后加上 null check轻松处理。然而你不知道这已经是你处理的第多少个空指针异常了。

    为了解决上面的问题,在 Java SE8 中引入了一个新类 java.util.Optional,这个类可以缓解上面的问题。

    你可能已经发现了,上面我用的是缓解而不是解决。这也是很多人理解不太对的地方,以为 Java SE8 中的 Optional 类可以解决空指针问题。其实 Optional 类的的使用只是提示你这里可能存在空值,需要特殊处理,并提供了一些特殊处理的方法。如果你把 Optional 类当作空指针的救命稻草而不加思考的使用,那么依旧会碰到错误。

    因为 Optional 是的 Java SE8 中引入的,因此本文中难免会有一些 JDK8 中的语法,如 Lambda 表达式,流处理等,但是都是基本形式,不会有过于复杂的案例。

    2. Optional 创建

    Optional 的创建一共有三种方式。

    /**
     * 创建一个 Optional
     */
    @Test
    public void createOptionalTest() {
        // Optional 构造方式1 - of 传入的值不能为 null
        Optional<String> helloOption = Optional.of("hello");
    
        // Optional 构造方式2 - empty 一个空 optional
        Optional<String> emptyOptional = Optional.empty();
    
        // Optional 构造方式3 - ofNullable 支持传入 null 值的 optional
        Optional<String> nullOptional = Optional.ofNullable(null);
    }

    其中构造方式1中 of 方法,如果传入的值会空,会报出 NullPointerException 异常。

    3. Optional 判断

    Optional 只是一个包装对象,想要判断里面有没有值可以使用 isPresent 方法检查其中是否有值 。

    /**
     * 检查是否有值
     */
    @Test
    public void checkOptionalTest() {
        Optional<String> helloOptional = Optional.of("Hello");
        System.out.println(helloOptional.isPresent());
    
        Optional<Object> emptyOptional = Optional.empty();
        System.out.println(emptyOptional.isPresent());
    }

    得到的输出:

    true
    false

    从 JDK11 开始,提供了 isEmpty方法用来检查相反的结果:是否为空。

    如果想要在有值的时候进行一下操作。可以使用 ifPresent方法。

    /**
     * 如果有值,输出长度
     */
    @Test
    public void whenIsPresent() {
        // 如果没有值,获取默认值
        Optional<String> helloOptional = Optional.of("Hello");
        Optional<String> emptyOptional = Optional.empty();
        helloOptional.ifPresent(s -> System.out.println(s.length()));
        emptyOptional.ifPresent(s -> System.out.println(s.length()));
    }

    输出结果:

    5

    4. Optional 获取值

    使用 get方法可以获取值,但是如果值不存在,会抛出 NoSuchElementException 异常。

    /**
     * 如果没有值,会抛异常
     */
    @Test
    public void getTest() {
        Optional<String> stringOptional = Optional.of("hello");
        System.out.println(stringOptional.get());
        // 如果没有值,会抛异常
        Optional<String> emptyOptional = Optional.empty();
        System.out.println(emptyOptional.get());
    }

    得到结果:

    hello
    
    java.util.NoSuchElementException: No value present
        at java.util.Optional.get(Optional.java:135)
        at net.codingme.feature.jdk8.Jdk8Optional.getTest(Jdk8Optional.java:91)

    5. Optional 默认值

    使用 orElse, orElseGet 方法可以在没有值的情况下获取给定的默认值。

    /**
     * 如果没有值,获取默认值
     */
    @Test
    public void whenIsNullGetTest() {
        // 如果没有值,获取默认值
        Optional<String> emptyOptional = Optional.empty();
        String orElse = emptyOptional.orElse("orElse default");
        String orElseGet = emptyOptional.orElseGet(() -> "orElseGet default");
        System.out.println(orElse);
        System.out.println(orElseGet);
    }

    得到的结果:

    orElse default
    orElseGet default

    看到这里你可能会有些疑惑了,这两个方法看起来效果是一模一样的,为什么会提供两个呢?下面再看一个例子,你会发现两者的区别。

     /**
     * orElse 和 orElseGet 的区别
     */
    @Test
    public void orElseAndOrElseGetTest() {
        // 如果没有值,默认值
        Optional<String> emptyOptional = Optional.empty();
        System.out.println("空Optional.orElse");
        String orElse = emptyOptional.orElse(getDefault());
        System.out.println("空Optional.orElseGet");
        String orElseGet = emptyOptional.orElseGet(() -> getDefault());
        System.out.println("空Optional.orElse结果:"+orElse);
        System.out.println("空Optional.orElseGet结果:"+orElseGet);
        System.out.println("--------------------------------");
        // 如果没有值,默认值
        Optional<String> stringOptional = Optional.of("hello");
        System.out.println("有值Optional.orElse");
        orElse = stringOptional.orElse(getDefault());
        System.out.println("有值Optional.orElseGet");
        orElseGet = stringOptional.orElseGet(() -> getDefault());
        System.out.println("有值Optional.orElse结果:"+orElse);
        System.out.println("有值Optional.orElseGet结果:"+orElseGet);
    }
    
    public String getDefault() {
        System.out.println("   获取默认值中..run getDeafult method");
        return "hello";
    }

    得到的输出:

    空Optional.orElse
       获取默认值中..run getDeafult method
    空Optional.orElseGet
       获取默认值中..run getDeafult method
    空Optional.orElse结果hello
    空Optional.orElseGet结果hello
    --------------------------------
    有值Optional.orElse
       获取默认值中..run getDeafult method
    有值Optional.orElseGet
    有值Optional.orElse结果hello
    有值Optional.orElseGet结果hello

    在这个例子中会发现 orElseGet 传入的方法在有值的情况下并不会运行。而 orElse却都会运行。

    6. Optional 异常

    使用 orElseThrow 在没有值的时候抛出异常

    /**
     * 如果没有值,抛出异常
     */
    @Test
    public void whenIsNullThrowExceTest() throws Exception {
        // 如果没有值,抛出异常
        Optional<String> emptyOptional = Optional.empty();
        String value = emptyOptional.orElseThrow(() -> new Exception("发现空值"));
        System.out.println(value);
    }

    得到结果:

    java.lang.Exception: 发现空值
        at net.codingme.feature.jdk8.Jdk8Optional.lambda$whenIsNullThrowExceTest$7(Jdk8Optional.java:118)
        at java.util.Optional.orElseThrow(Optional.java:290)
        at net.codingme.feature.jdk8.Jdk8Optional.whenIsNullThrowExceTest(Jdk8Optional.java:118)

    7. Optional 函数接口

    Optional 随 JDK8 一同出现,必然会有一些 JDK8 中的新特性,比如函数接口。Optional 中主要有三个传入函数接口的方法,分别是filtermapflatMap。这里面的实现其实是 JDK8 的另一个新特性了,因此这里只是简单演示,不做解释。后面放到其他 JDK8 新特性文章里介绍。

    @Test
    public void functionTest() {
        // filter 过滤
        Optional<Integer> optional123 = Optional.of(123);
        optional123.filter(num -> num == 123).ifPresent(num -> System.out.println(num));
    
        Optional<Integer> optional456 = Optional.of(456);
        optional456.filter(num -> num == 123).ifPresent(num -> System.out.println(num));
    
        // map 转换
        Optional<Integer> optional789 = Optional.of(789);
        optional789.map(String::valueOf).map(String::length).ifPresent(length -> System.out.println(length));
    }

    得到结果:

    123
    3

    8. Optional 案例

    假设有计算机、声卡、usb 三种硬件(下面的代码中使用了 Lombok@Data 注解)。

    /**
     * 计算机
     */
    @Data
    class Computer {
        private Optional<SoundCard> soundCard;
    }
    
    /**
     * 声卡
     */
    @Data
    class SoundCard {
        private Optional<Usb> usb;
    }
    
    /**
     * USB
     */
    @Data
    class Usb {
        private String version;
    }

    计算机可能会有声卡,声卡可能会有 usb。那么怎么取得 usb 版本呢?

    /**
     * 电脑里【有可能】有声卡
     * 声卡【有可能】有USB接口
     */
    @Test
    public void optionalTest() {
        // 没有声卡,没有 Usb 的电脑
        Computer computerNoUsb = new Computer();
        computerNoUsb.setSoundCard(Optional.empty());
        // 获取 usb 版本
        Optional<Computer> computerOptional = Optional.ofNullable(computerNoUsb);
        String version = computerOptional.flatMap(Computer::getSoundCard).flatMap(SoundCard::getUsb)
            .map(Usb::getVersion).orElse("UNKNOWN");
        System.out.println(version);
        System.out.println("-----------------");
    
        // 如果有值,则输出
        SoundCard soundCard = new SoundCard();
        Usb usb = new Usb();
        usb.setVersion("2.0");
        soundCard.setUsb(Optional.ofNullable(usb));
        Optional<SoundCard> optionalSoundCard = Optional.ofNullable(soundCard);
        optionalSoundCard.ifPresent(System.out::println);
        // 如果有值,则输出
        if (optionalSoundCard.isPresent()) {
            System.out.println(optionalSoundCard.get());
        }
    
        // 输出没有值,则没有输出
        Optional<SoundCard> optionalSoundCardEmpty = Optional.ofNullable(null);
        optionalSoundCardEmpty.ifPresent(System.out::println);
        System.out.println("-----------------");
    
        // 筛选 Usb2.0
        optionalSoundCard.map(SoundCard::getUsb)
                .filter(usb1 -> "3.0".equals(usb1.map(Usb::getVersion)
                .orElse("UBKNOW")))
                .ifPresent(System.out::println);
    }

    得到结果:

    UNKNOWN
    -----------------
    SoundCard(usb=Optional[Usb(version=2.0)])
    SoundCard(usb=Optional[Usb(version=2.0)])
    -----------------

    9. Optional 总结

    在本文中,我们看到了如何使用 Java SE8 的 java.util.Optional 类。Optional 类的目的不是为了替换代码中的每个空引用,而是为了帮助更好的设计程序,让使用者可以仅通过观察属性类型就可以知道会不会有空值。另外,Optional不提供直接获取值的方法,使用时会强迫你处理不存在的情况。间接的让你的程序免受空指针的影响。

    文中代码已经上传 Github:https://github.com/niumoo/jdk-feature


    Java零基础视频教程:

    Java基础、入门、精通、架构师全套资源shimo.im
    8455f4762fbb6a0ae69e4cbce81999d8.png

    bdbc77eba75e66955ca59f1bd074c495.png

    推荐阅读:

    java钢铁侠-马克51号:面向监狱编程,程序员偷走共享单车3个亿。zhuanlan.zhihu.com
    2923e2caff75b1a7bcde91f1e42913f7.png
    java钢铁侠-马克51号:京东砸3亿激励一线员工:要么花钱抢人才,要么省钱养废材!zhuanlan.zhihu.com
    7b92efaa9e5873014e8d01a9c44cee3f.png
    java钢铁侠-马克51号:面试题:为什么MySQL的索引不采用kafka的索引机制zhuanlan.zhihu.com
    1198ebc7f79929e657bcd3f721b1208f.png
    展开全文
  • System.out.println("所在行数:"+count); Pattern p=Pattern.compile(regex_nd); Matcher m=p.matcher(s); if(m.find()) { tmp.add(new StringBuffer(m.group...
  • [code="java"] private final String TREE_PATH = "src/org/SuperMarket/tree/model/doc/tree.xml"; private Element root; public TreeDAOImpl() { SAXReader reader = new SAXReader(); try { ...
  • 案例:有时候我们需要把自己捕获的异常,保存下来 那么就要精确的定位到哪一行报错public static StringBuffer getTraceInfo(Exception e) {StringBuffer sb = new StringBuffer();StackTraceElement[] stacks = e....
  • RAISERROR('零售单[%s]不存在,请退出收银...SET NOCOUNT ON -- 不打印sql日志中的影响行数信息 貌似将最后一个受影响行数‘0’当作了成功的返回值进行了返回 解决方案 存储过程中添加 SET NOCOUNT ON -- 不打印s...
  • 如果输入的数据小于0,报错,并且提醒用户重新输入 需要程序运行输入的次数 比如需要打印5次, ####* ###**** ##****** #******** ********** */ //导包 import java.util.Scanner; class PrintEquicruralTriangle...
  • 更新时返回值为0,影响行数为0。不知道为什么,自己尝试在数据库管理系统执行sql语句是有作用的。也不报错,求大神!2.代码如下:1)Mapper.xmlupdate cardownmemberId = #{memberid,jdbcType=INTEGER},cardId = #{...
  • 安装Android SDK 报错

    千次阅读 2018-09-15 01:06:55
    然后我删了文件重装,但是第二次依旧报错,虽然行数变少了 java.io.IOException: Cannot download 'https://dl.google.com/android/repository/android_m2repository_r47.zip': Read timed out , response: 200 OK ...
  • 看OrgBudgetServiceImpl.validateBudgetValue(OrgBudgetServiceImpl.java:4371)方法中对应的行数然后在这一行中就可以找到那一个报错行数,就可以追本溯源因为一些模块有二开过,有写模块是没有二开过的。...
  • java中定位当前异常的位置(行数)

    千次阅读 2012-04-17 10:36:47
    有时候我们需要把自己捕获的异常,保存下来 那么就要精确的定位到哪一行报错 public static StringBuffer getTraceInfo(Exception e) { StringBuffer sb = new StringBuffer(); StackTraceElement[] stacks = e....
  • insert语句插入当前时间报错

    千次阅读 2019-07-29 16:39:10
    在使用queryrunner执行sql语句时,...报错信息:java.sql.SQLException: Wrong number of parameters: expected 0, was given 1 Query 将语句改写成存储过程也报错,返回的影响行数为-1,但是删除存储过程中的SE...
  • 调试jsp页面

    千次阅读 2016-05-17 09:19:22
    调试jsp页面时,由于java代码已经被编译了,所以浏览器显示出的报错行数往往是不能和以前jsp页面对应的,导致错误不方便调试,如下图所示: 这时候只需要查看网页网页源代码即可找到错误的行代码。
  • //处理结果:显示受影响行数 System.out.println(result); }catch (ClassNotFoundException e) { e.printStackTrace(); }catch (Exception e) { e.printStackTrace(); }finally { if...
  • 如题所述,使用Java代码执行删除、创建临时表的存储过程时总是执行不成功(不报错, 但是获取的影响行数为-1),别的存储过程都可以执行成功,求大师指点啊, 存储过程和Java代码如下: 1、存储过程代码 ALTER ...
  • 统计源代码行数

    千次阅读 2009-12-15 09:37:00
    昨天需要统计源代码行数,就想找个工具用。还真不好找。 首先试用的是statcvs,下载之后按照readme.txt里面的步骤执行,结果报错java -jar statcvs.jar /tmp/aaaa.log /tmp/aaaaStatCVS - CVS statistics ...
  • //受影响行数 int result = 0; //数据库连接对象 Connection conn = null; //SQL执行对象 PreparedStatement pstmt = null; try { //创建数据库链接 conn = this.getConn(); //创建SQL执行对象 pstmt = ...
  • "E:\软件备份\Android Studio\android-studio-ide-193.6626763-windows\jre\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:30700,suspend=y,server=n -ea -Didea.test.cyclic
  • Jsp页面报错是很麻烦的事情,一般不太好找异常出在哪里。 其实jsp最后也要编译成java,class文件。...根据后台异常报出来的jsp异常行数,就可以找到相应的java代码中的错误行。至少这样你会比较有感觉了吧? ...
  • 13:14:41,967 INFO [STDOUT] 最底层持久化类com.zhl.ejb.EjbDataBase 的 executeQuery 方法出错,出错的行数为: 394 行。执行SQL语句异常,具体的错误信息是:Unknown column 'c.prequery' in 'where clause' 13:...
  • 1. 前言 如果你没有处理过空指针,那么你不是一...这是你可能会想,这报错很好处理,然后你看了眼报错行数,对比了下代码。脑海里瞬间闪过 ”对对对,这里有可能为空“,然后加上 null check轻松处理。然而你不知...
  • 来源:https://0x9.me/BIXkm1. 前言如果你没有处理过空指针,那么你不是一位...这是你可能会想,这报错很好处理,然后你看了眼报错行数,对比了下代码。脑海里瞬间闪过 ”对对对,这里有可能为空“,然后加上 null ...
  • 使用Java的poi包导出excel超过1048575行报错,不是程序问题而是excel只能支持一个sheet的最大行数,解决办法是超过最大行数后新建一个sheet页
  • 使用Maven对项目进行编译,报错如下: ReportAction.java:[32,0] 非法的表达式开始 查找对应的文件行数,发现该行是Struts的注解配置, 由于 Struts 的注解中,多加了个逗号(,)代码不严格导致,MyEclipse...
  • //判断初始化,如果非零就不再初始化变量,不然前面的行数会刷新到0 private HSSFWorkbook workbook = null; private HSSFSheet sheet = null; private HSSFRow row = null; private String outputFile = null...

空空如也

空空如也

1 2 3 4 5
收藏数 94
精华内容 37
关键字:

java报错行数

java 订阅