【Java SE 基础学习打卡】31 方法的返回值与void关键字

目录

  • 前言
  • [一、有返回值方法:让方法 "有产出"(return 返回数据 + 结束方法)](#一、有返回值方法:让方法 “有产出”(return 返回数据 + 结束方法))
    • [1.1 生活化类比(秒懂)](#1.1 生活化类比(秒懂))
    • [1.2 定义规则](#1.2 定义规则)
    • [1.3 代码示例(求和方法:返回 int 类型结果)](#1.3 代码示例(求和方法:返回 int 类型结果))
    • [1.4 return 的 "结束方法" 作用(关键特性)](#1.4 return 的 “结束方法” 作用(关键特性))
  • [二、无返回值方法:让方法 "只干活"(void 修饰,return 可选)](#二、无返回值方法:让方法 “只干活”(void 修饰,return 可选))
    • [2.1 生活化类比(秒懂)](#2.1 生活化类比(秒懂))
    • [2.2 定义规则](#2.2 定义规则)
    • [2.3 代码示例(打印方法:void 修饰,无返回值)](#2.3 代码示例(打印方法:void 修饰,无返回值))
    • [2.4 关键提醒:void 方法不能接收返回值](#2.4 关键提醒:void 方法不能接收返回值)
  • 三、返回值类型不匹配的常见错误与解决
    • [3.1 错误 1:return 值类型 ≠ 声明的返回值类型](#3.1 错误 1:return 值类型 ≠ 声明的返回值类型)
    • [3.2 错误 2:有返回值方法漏写 return 语句](#3.2 错误 2:有返回值方法漏写 return 语句)
    • [3.3 错误 3:void 方法中 return 后跟值](#3.3 错误 3:void 方法中 return 后跟值)
    • [3.4 错误 4:分支场景下,部分路径漏写 return](#3.4 错误 4:分支场景下,部分路径漏写 return)
  • [四、新手必避的 5 个 "致命坑"](#四、新手必避的 5 个 “致命坑”)
    • [4.1 坑 1:有返回值方法只在分支里写 return](#4.1 坑 1:有返回值方法只在分支里写 return)
    • [4.2 坑 2:void 方法试图返回值](#4.2 坑 2:void 方法试图返回值)
    • [4.3 坑 3:返回值类型是 double,却返回 int(隐式转换坑)](#4.3 坑 3:返回值类型是 double,却返回 int(隐式转换坑))
    • [4.4 坑 4:调用有返回值方法时,忽略返回值(逻辑坑)](#4.4 坑 4:调用有返回值方法时,忽略返回值(逻辑坑))
    • [4.5 坑 5:return 后写代码(不可达代码)](#4.5 坑 5:return 后写代码(不可达代码))
  • 总结

前言

上一节咱们学了方法重载,解决了 "同名方法适配不同参数" 的问题。但新手写方法时还会卡在一个关键点:什么时候方法要 "返回结果"(比如求和后给个数字),什么时候只需要 "干活就行"(比如打印内容)?return 语句到底该怎么写?为什么有时候写 return 会报错,有时候不写又不行?

这一节咱们就聚焦 "返回值" 和 "void 关键字",把方法的 "产出规则" 讲透:先搞懂有返回值方法的定义和调用(return 既返回数据又结束方法),再学无返回值方法(void 修饰,return 可选仅结束方法),最后拆解返回值类型不匹配的常见错误 ------ 全程用生活化场景 + 可运行代码,保证新手能精准掌握 "什么时候要返回、怎么返回"!

一、有返回值方法:让方法 "有产出"(return 返回数据 + 结束方法)

1.1 生活化类比(秒懂)

你去便利店买一瓶可乐:

  • 你给店员 10 元(传参数);

  • 店员做两件事:把可乐递给你(返回数据)、结束这次交易(结束方法);

  • 核心:你要的是 "可乐" 这个 "产出",没有这个产出,交易就没意义。

1.2 定义规则

有返回值方法的核心是:返回值类型要和 return 后的值类型一致,且必须写 return 语句。定义格式:

java 复制代码
修饰符 返回值类型 方法名(参数列表) {
    // 业务逻辑
    执行语句;
    // 必须写return,且值的类型和返回值类型一致
    return 对应类型的值;
}

1.3 代码示例(求和方法:返回 int 类型结果)

java 复制代码
public class ReturnValueDemo {
    // 有返回值方法:计算两个int数的和,返回int类型
    public static int add(int a, int b) {
        int sum = a + b;
        // return的两个作用:
        // 1. 返回sum的值(和返回值类型int一致);
        // 2. 结束方法,后面的代码不会执行
        return sum;
        System.out.println("这行代码永远执行不到"); // 编译报错:return后不可达
    }

    public static void main(String[] args) {
        // 调用有返回值方法:必须接收返回值(或直接使用)
        int result = add(10, 20); // 接收返回值30
        System.out.println("10+20=" + result); // 输出30

        // 也可以直接使用返回值,不单独接收
        System.out.println("20+30=" + add(20, 30)); // 输出50
    }
}

1.4 return 的 "结束方法" 作用(关键特性)

return 不仅能返回数据,还会立即结束方法,哪怕后面还有代码:

java 复制代码
// 例子:找到1-10中第一个偶数就返回,后面的数字不再检查
public static int findFirstEven() {
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            return i; // 找到2,返回并结束方法,循环直接终止
        }
        System.out.println("检查数字:" + i); // 只打印1
    }
    return -1; // 兜底return(避免编译报错,实际不会执行)
}

public static void main(String[] args) {
    int firstEven = findFirstEven();
    System.out.println("第一个偶数:" + firstEven); // 输出2
}

执行结果:

Java 复制代码
检查数字:1
第一个偶数:2

二、无返回值方法:让方法 "只干活"(void 修饰,return 可选)

2.1 生活化类比(秒懂)

你去奶茶店让店员 "打扫一下操作台":

  • 你不用店员返回任何东西(无返回值);

  • 店员只需要完成 "打扫" 这个动作(执行方法体),做完就结束;

  • 核心:要的是 "动作完成",不是 "具体产出"。

2.2 定义规则

无返回值方法的核心是:用 void 修饰返回值类型,return 可选(仅用于结束方法)。定义格式:

java 复制代码
修饰符 void 方法名(参数列表) {
    // 业务逻辑(只干活,不返回数据)
    执行语句;
    // 可选:写return; 仅结束方法,后面不能跟任何值
    // return;
}

2.3 代码示例(打印方法:void 修饰,无返回值)

java 复制代码
public class VoidMethodDemo {
    // 无返回值方法:打印欢迎语,只干活不返回数据
    public static void printWelcome() {
        System.out.println("======================");
        System.out.println("  欢迎学习Java方法!");
        System.out.println("======================");
        // void方法可以不写return,方法执行完自动结束
    }

    // 无返回值方法:用return提前结束(可选)
    public static void printNum(int n) {
        for (int i = 1; i <= n; i++) {
            if (i == 5) {
                return; // 提前结束方法,只打印1-4
            }
            System.out.println("数字:" + i);
        }
    }

    public static void main(String[] args) {
        // 调用无返回值方法:直接调用,不能接收返回值
        printWelcome(); 
        printNum(10); // 只打印1-4
    }
}

2.4 关键提醒:void 方法不能接收返回值

新手容易犯的错:试图接收 void 方法的返回值,编译直接报错:

java 复制代码
// 错误示例:void方法没有返回值,不能接收
int res = printWelcome(); // 编译报错:不兼容的类型:void无法转换为int

三、返回值类型不匹配的常见错误与解决

新手写 return 最容易出错的地方就是 "类型不匹配",下面拆解 3 个典型错误,给出解决方法:

3.1 错误 1:return 值类型 ≠ 声明的返回值类型

反例:

java 复制代码
// 声明返回值类型是int,却返回double
public static int add(int a, int b) {
    double sum = a + b;
    return sum; // 编译报错:double无法转换为int
}

解决方法:

  1. 让 return 值类型匹配返回值类型(推荐):

    java 复制代码
    public static int add(int a, int b) {
        int sum = a + b;
        return sum; // int匹配int
    }
  2. 调整返回值类型,适配 return 值:

    java 复制代码
    public static double add(int a, int b) {
        double sum = a + b;
        return sum; // double匹配double
    }

3.2 错误 2:有返回值方法漏写 return 语句

反例:

java 复制代码
// 声明返回值类型是int,但漏写return
public static int sumToN(int n) {
    int sum = 0;
    for (int i = 1; i <= n; i++) {
        sum += i;
    }
    // 漏写return,编译报错:缺少返回语句
}

解决方法:

必须补充 return 语句,且值类型匹配:

java 复制代码
public static int sumToN(int n) {
    int sum = 0;
    for (int i = 1; i <= n; i++) {
        sum += i;
    }
    return sum; // 补充return,int匹配int
}

3.3 错误 3:void 方法中 return 后跟值

反例:

java 复制代码
// void方法不能返回值,return后不能跟任何内容
public static void printNum(int n) {
    return n; // 编译报错:void方法不能返回值
}

解决方法:

  1. 如果需要返回值:把 void 改成对应返回值类型;

  2. 如果只是想结束方法:写return;(无值):

    java 复制代码
    public static void printNum(int n) {
        if (n < 0) {
            return; // 仅结束方法,无返回值
        }
        System.out.println(n);
    }

3.4 错误 4:分支场景下,部分路径漏写 return

反例:

java 复制代码
// if分支有return,else分支漏写,编译报错
public static int getScoreLevel(int score) {
    if (score >= 90) {
        return 1; // 优秀
    } else if (score >= 80) {
        return 2; // 良好
    }
    // 漏写return,编译报错:缺少返回语句
}

解决方法:

保证所有执行路径都有 return,或补充兜底 return:

java 复制代码
public static int getScoreLevel(int score) {
    if (score >= 90) {
        return 1;
    } else if (score >= 80) {
        return 2;
    } else {
        return 3; // 兜底return,覆盖所有情况
    }
}

四、新手必避的 5 个 "致命坑"

4.1 坑 1:有返回值方法只在分支里写 return

  • 错误示例:

    java 复制代码
    public static int findNum(int n) {
        if (n > 0) {
            return n; // 仅分支里有return,编译报错
        }
    }
  • 避坑:要么给所有分支加 return,要么在方法末尾加兜底 return(比如 return -1)。

4.2 坑 2:void 方法试图返回值

  • 错误示例:

    java 复制代码
    public static void printSum(int a, int b) {
        return a + b; // void不能返回值
    }
  • 避坑:如果需要返回和,把 void 改成 int;如果只是打印,直接System.out.println(a+b)

4.3 坑 3:返回值类型是 double,却返回 int(隐式转换坑)

  • 错误示例:

    java 复制代码
    // 看似int能转double,但新手容易忽略"精度问题"
    public static double calcAvg(int a, int b) {
        return (a + b) / 2; // 返回int(比如10+20=30/2=15),不是double的15.0
    }
  • 避坑:强制转换为 double,保证类型匹配且精度正确:

    java 复制代码
    public static double calcAvg(int a, int b) {
        return (double)(a + b) / 2; // 返回15.0,匹配double
    }

4.4 坑 4:调用有返回值方法时,忽略返回值(逻辑坑)

  • 错误示例:

    java 复制代码
    // 调用add方法却不接收返回值,白执行了求和逻辑
    add(10, 20);
  • 避坑:要么接收返回值,要么直接使用(比如System.out.println(add(10,20))),不要无意义调用。

4.5 坑 5:return 后写代码(不可达代码)

  • 错误示例:

    java 复制代码
    public static int add(int a, int b) {
        return a + b;
        System.out.println("求和完成"); // 编译报错
    }
  • 避坑:return 是方法的 "最后一步",后面不能写任何代码。

总结

这一节咱们掌握了方法返回值和 void 关键字的核心规则,记住 3 个核心点:

  1. 有返回值方法:返回值类型和 return 值类型必须一致,且必须写 return(返回数据 + 结束方法);

  2. 无返回值方法:用 void 修饰,return 可选(仅结束方法,不能跟值);

  3. 常见错误:类型不匹配、漏写 return、void 方法返回值,需按类型匹配原则修正。

返回值是方法和调用者之间的 "数据桥梁",掌握它的规则,能让方法的 "产出" 和 "执行逻辑" 更清晰。

相关推荐
编程彩机5 天前
互联网大厂Java面试:从Java SE到大数据场景的技术深度解析
java·大数据·spring boot·面试·spark·java se·互联网大厂
编程火箭车5 天前
【Java SE 基础学习打卡】37 二维数组
二维数组·数组遍历·java se·java 基础·二维数组初始化·不规则二维数组·表格型数据存储
编程火箭车15 天前
【Java SE 基础学习打卡】36 数组的常见操作
冒泡排序·java se·java 基础·线性查找·数组常见操作·数组增删改·数组拷贝
编程火箭车16 天前
【Java SE 基础学习打卡】35 数组元素的访问与遍历
数组索引·java se·java 基础·java 数组·数组元素访问与遍历·普通 for 循环·增强 for 循环
编程火箭车19 天前
【Java SE 基础学习打卡】34 数组的定义与初始化
java se·java 基础·java 数组·数组定义与初始化·静态初始化·动态初始化·length 属性
编程火箭车20 天前
【Java SE 基础学习打卡】33 数组的概述
java se·java 基础·数组概述·数组核心特征·java 数组·批量存储数据·连续内存存储
编程火箭车21 天前
【Java SE 基础学习打卡】32 方法的嵌套调用与递归调用
java se·java 基础·java 方法·方法嵌套调用·方法递归调用·递归终止条件·递归应用场景
编程火箭车24 天前
【Java SE 基础学习打卡】28 方法的定义与调用
java se·参数传递·返回值·java 基础·新手避坑·java 方法·方法定义与调用
编程火箭车1 个月前
【Java SE 基础学习打卡】27 方法的概述
编程语法·java se·代码复用·编程小白入门·方法概述·功能模块化·java 方法