java学习(二)idea的调试;一个演示小程序:mtv点歌

勇哥注:

这个系列的贴子主要是从Visual Studio+ C#语言的角度对比来学习java。
C#其实一门学习java的语言,两者是竞争关系。大部分人都是java转C#,这个系列贴子则是反过来由C#转java。


测试断点,单步调试


比较有特点的是,在断点的圆点上右键,可以设置条件断点,例如i==10的时候断下。

另外vs的实时窗口可以输入表达式查阅变量的值,在ida中(windows中)使用表达式计算功能image.png可以类似效果(如图2所示)

更多的调试技巧见:https://zhuanlan.zhihu.com/p/697641921


image.png

(图1)


image.png

(图2  表达式计算)


横 1:从其他界面回到当前断点界面光标处。

横 2:从断点处开始,逐行执行代码,如果遇到方法,直接跳过。

横 3:从断点处开始,逐行执行代码,如果遇到方法,会进入方法,但是只能进入自定义方法,不会进入官方类库的方法。

横 4:从断点处开始,逐行执行代码,如果遇到方法,会进入方法,适用于所有方法。

横 5:从当前断点处回退,回到方法的调用处。

横 6:回退断点,回到上一个断点处,与横 5 的区别在于,它会回到上一个方法的断点中,而横 5 只会回到上一个方法的调用处,并不会进入方法。

横 7:回到断点光标处,与横 1 的区别在于,它会继续往后执行一行代码。

横 8:计算表达式,在 debug 模式中,可以直接输入当前类中的任意一个方法,直接进行运算,输出结果,如下图所示。


竖 1:重新运行程序,进入 debug 模式。

竖 2:执行程序,但不是逐行执行,而是跳转到下一个断点处。

竖 3:暂停断点,这个基本用不到。

竖 4:终止程序的运行。

竖 5:显示所有断点,如下图所示。

竖 6:让所有断点失效,debug 不再进入断点,要恢复断点,再次点击此按钮即可。


一个小测试例子:MTV点歌

功能很简单:

输入歌曲名,然后从一个歌曲数据库(一个文本文件)中模糊搜索结果,最后用户输入索引号,调用播放器SPlayer.exe来播放此歌曲。

无论什么语言,UI部分都是比较浪费学习精力的。

所以在这个系统贴子里,我们先避免使用UI。

package com.skcircle.mtvdemo;

import com.sun.org.apache.bcel.internal.Const;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.PrimitiveIterator;
import java.util.Scanner;

public class mtvMain {
    public static void main(String[] args) throws IOException {
        String musicName;
        Scanner sc=new Scanner(System.in);
        System.out.println("输入歌曲名:");
        while(true) {
            musicName = sc.nextLine();
            if (musicName.length() < 1) {
                System.out.println("歌曲名字要大于等于1个字符");
                continue;
            }
            break;
        }
        List<String> f1=mtvMethod.findMusic(musicName);
        for (String str:f1
             ) {
            int index1= f1.indexOf(str)+1;
            System.out.println("["+index1+"]"+str);
        }
        System.out.println("搜索结果:"+f1.size());

        System.out.println("输入歌曲编号(1-"+f1.size()+"):");
        String selMusic = sc.nextLine();

        String name=f1.get(Integer.parseInt(selMusic)-1);
        String m="G:\\KuGou\\"+name;

        ProcessBuilder pb=new ProcessBuilder("C:\\Program Files (x86)\\SPlayer\\splayer.exe",m);
        Process p= pb.start();
        sc.close();
    }
}

class mtvMethod
{
    private static String MusicPath=
            "D:\\新技术学习与实验\\java\\mtv2\\mymtv\\src\\com\\skcircle\\mtvdemo\\allMtvList";
    static List<String> findMusic(String _musicName) throws IOException {
        List<String> res=new ArrayList<>();
        String txt=new String(Files.readAllBytes(Paths.get(MusicPath)), StandardCharsets.UTF_8);
        String[] ary1= txt.split("\n");
       /* for(int i=0;i< ary1.length;i++)
        {
            System.out.println(ary1[i]);
        }*/

        for (String str:ary1
             ) {
            if(str.indexOf(_musicName)>=0)
            {
                res.add(str);
            }
            //System.out.println(str);
        }
        return res;
    }


}


运行结果:

输入歌曲名:

凤凰传奇

[1]凤凰传奇 - 中国味道.mkv

[2]凤凰传奇 - 全是爱.mkv

[3]凤凰传奇 - 吉祥如意 - 相约北京.mkv

[4]凤凰传奇 - 天籁传奇.mkv

[5]凤凰传奇 - 大声唱 - 绿旋风.mkv

[6]凤凰传奇 - 天蓝蓝.mkv

[7]凤凰传奇 - 奢香夫人.mkv

[8]凤凰传奇 - 我不是公主.mkv

[9]凤凰传奇 - 我从草原来.mkv

[10]凤凰传奇 - 我和草原有个约定.mkv

[11]凤凰传奇 - 我们的歌谣.mkv

[12]凤凰传奇 - 新康定情歌.mkv

[13]凤凰传奇 - 最炫民族风.mkv

[14]凤凰传奇 - 溜溜的情歌.mkv

[15]凤凰传奇 - 相约北京 - 北京平四 北京平四 奥运.mkv

[16]凤凰传奇 - 等爱的玫瑰.mkv

[17]凤凰传奇 - 相约北京.mkv

[18]凤凰传奇 - 策马奔腾.mkv

[19]凤凰传奇 - 绿旋风.mkv

[20]凤凰传奇 - 自由飞翔.mkv

[21]凤凰传奇 - 荷塘月色.mkv

[22]凤凰传奇 - 草原凤凰.mkv

[23]凤凰传奇 - 郎的诱惑.mkv

[24]凤凰传奇 - 醉美天下.mkv

[25]凤凰传奇 - 高山槐花开.mkv

[26]凤凰传奇-全是爱_国语_流行_MTV_128033273_[28881.com]_MV分享精灵_MTVP2P.mkv

[27]凤凰传奇-大声唱.mkv

[28]凤凰传奇-大声唱_国语_流行_KTV_FP31232839_[mvmkv.com]_MV分享精灵_MTVP2P.mkv

[29]凤凰传奇-大声唱_国语_流行_KTV_FP40520425_[28881.com]_MV分享精灵_MTVP2P.mkv

[30]凤凰传奇-天籁传奇_国语_流行_NCB03019_[mvmkv.com]_MV分享精灵_MTVP2P.mkv

[31]凤凰传奇-我从草原来_国语_流行_MTV_107033291_[28881.com]_MV分享精灵_MTVP2P.mkv

[32]凤凰传奇-我们的歌谣_国语_流行_MTV_128033292_[mvmkv.com]_MV分享精灵_MTVP2P.mkv

[33]凤凰传奇-最炫民族风_国语_流行_MTV_111033299_[28881.com]_MV分享精灵_MTVP2P.mkv

[34]凤凰传奇-策马奔腾.mkv

[35]凤凰传奇-自由飞翔_国语_流行_MTV_169033317_[28881.com]_MV分享精灵_MTVP2P.mkv

[36]凤凰传奇-荷塘月色_国语_流行_KTV_140033321_[28881.com]_MV分享精灵_MTVP2P.mkv

[37]凤凰传奇-高山槐花开_国语_情歌对唱_NAA02118_[mvmkv.com]_MV分享精灵_MTVP2P.mkv

[38]凤凰传奇^玖月奇迹-美丽华语走起来_国语_情歌对唱_NAF01827_[mvmkv.com]_MV分享精灵_MTVP2P.mkv

[39]筷子兄弟^凤凰传奇-最炫小苹果_国语_情歌对唱_NAF10220_[mvmkv.com]_MV分享精灵_MTVP2P.mkv

[40]凤凰传奇-将进酒_国语_流行_N8300124_[mvmkv.com]_MV分享精灵_MTVP2P.mkv

搜索结果:40

输入歌曲编号(1-40):

36

image.png


从这段小程序中,发现几个java不一样的地方:

1.  String[] 是没有indexof()这样的方法的。List<String>则有。

2.  如果想把String[]转为List<String>, 使用java8的stream API。

  String[] stringArray = {"apple", "banana", "cherry"};  

        List<String> stringList = Arrays.stream(stringArray)  

                .collect(Collectors.toList());  

这个没C#的扩展方法.ToList<T>来得方便。

java没有扩展方法。


3.  throws声明异常 

例如下面的main方法的throws,是由于new Scanner(System.in); 这句被编译器报错,然后通过一个向导自动添加上去的。

public static void main(String[] args) throws IOException {
        String musicName;
        Scanner sc=new Scanner(System.in);

throws关键字用于在方法签名中声明该方法可能会抛出的检查型异常(checked exceptions)。

当你使用throws声明一个异常时,你告诉方法的调用者:

“这个方法可能会因为某些原因抛出这个异常,所以你需要处理它。”

处理异常的方式有两种:捕获(使用try-catch块)或继续声明(使用throws)。

C#中没有这种特性,只是在///这样的xml注释中,写清楚此函数有哪些异常,仅做为编写代码时的提示作用。


相关文章列表:

java学习(一)基本语法、专用ide之idea 

java学习(二)idea的调试 


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2024-08-21 21:44:54 编辑

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864