方法不起作用

Posted

技术标签:

【中文标题】方法不起作用【英文标题】:Method not functioning 【发布时间】:2020-01-23 05:39:36 【问题描述】:

我正在编写一个程序来修复电影字幕文件(.srt)。将代码放在 main 方法中可以正常工作,但是现在我创建了一个简化代码的方法,该方法似乎不起作用并且输出与输入相同,没有做任何事情来来回调整字幕。

import java.util.Scanner;
import java.io.File;
import java.util.Formatter;
import java.io.FileNotFoundException;

public class SubtitleFixer

    public static void main(String[] args)
    
        try
            File subFile = new File("/sdcard/UCDownloads/video/hichkiSub.srt");
            Formatter fixedSubFile = new Formatter("/sdcard/UCDownloads/video/newhichkiSubFixed.srt");

            Scanner scanText = new Scanner(subFile);
            while(scanText.hasNext())
                String textFound = scanText.nextLine();
                if (textFound.contains("-->"))

                String fromHour, fromMins, fromSecs, middleText, toHour, toMins, toSecs, endText;
                int adjustMins = 1, adjustSecs = 2;

                    fromHour = textFound.substring(0,2);
                    fromMins = textFound.substring(3,5);
                    fromSecs = textFound.substring(6,8);
                    middleText = textFound.substring(8,17);
                    toHour = textFound.substring(17,19);
                    toMins = textFound.substring(20,22);
                    toSecs = textFound.substring(23,25);
                    endText = textFound.substring(25);

                    fixSubTime(fromSecs,adjustSecs,fromMins);
                    fixSubTime(fromMins,adjustMins,fromHour);
                    fixSubTime(toSecs,adjustSecs,toMins);
                    fixSubTime(toMins,adjustMins,toHour);

                    textFound = fromHour+":"+fromMins+":"+fromSecs+middleText+toHour+":"+toMins+":"+toSecs+endText;
                
            fixedSubFile.format("%s\n",textFound);
            
            scanText.close();
            fixedSubFile.close();
        catch(FileNotFoundException error)System.out.println(error);

    

    private static void fixSubTime(String fromOrTo, int adjSecsOrMins, String minsOrHour)
        int fromOrToNum = Integer.parseInt(fromOrTo);
        int minsOrHourNum = Integer.parseInt(minsOrHour);
        fromOrToNum += adjSecsOrMins;
        if (fromOrToNum >= 60)
            fromOrToNum -= 60; minsOrHourNum += 1;
        
        else if(fromOrToNum < 0) 
            fromOrToNum += 60; minsOrHourNum -= 1;
        
        formatNum(fromOrToNum, fromOrTo);
        formatNum(minsOrHourNum,minsOrHour);
    

    private static void formatNum(int num, String text)
        if (num <= 9)
            text = "0"+num;
        
        else 
            text = ""+num;
        
    

输出(与输入相同):

1 00:01:15,784 --> 00:01:17,994 女士,先生现在见。

2 00:01:23,416 --> 00:01:24,376 谢谢。

3 00:01:43,687 --> 00:01:45,730 奈娜·马图尔女士。请坐。

4 00:01:47,565 --> 00:01:48,942 教育双学士学位。

5 00:01:49,317 --> 00:01:51,277 和理学硕士。 感人的。 ...

预期输出:

1 00:02:17,784 --> 00:02:19,994 女士,先生现在见。

2 00:02:25,416 --> 00:02:26,376 谢谢。

3 00:02:45,687 --> 00:02:47,730 奈娜·马图尔女士。请坐。

4 00:02:49,565 --> 00:02:50,942 教育双学士学位。

5 00:02:51,317 --> 00:02:53,277 和理学硕士。令人印象深刻。

【问题讨论】:

private static void formatNum(int num, String text) - 这不起作用。 Java 是按值传递的。尝试更改此方法以返回新的String 对象 是的,没错,我不知道 Java 字符串是如何通过引用类型传递的,但现在我知道了 【参考方案1】:

您的格式化方法创建了一个新的、可操作的 String 对象,然后将其丢弃。因此,您将在特定的单一方法调用范围之外获得新的结果。

您需要返回结果并在您的调用方法中接受它。

private static String formatNum(int num, String text)
    if (num <= 9)
        return "0"+num;
    
    else 
        return Integer.toString(num);
    

调用应该是这样的:

fromOrTo = formatNum(fromOrToNum, fromOrTo);

P.S.:String.format() 表示您的格式方法尝试执行的操作。

【讨论】:

是的,谢谢,我没有记住这一点。并感谢您的提示。但是,在调用方法 (fixSubTime) 中出现了相同的错误,我需要在其中操作两个变量并获取它们的结果。由于我不能同时返回两个值,我不得不重组我的代码。

以上是关于方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot异步任务及Async不起作用的原因

Fastjson @JsonField 不起作用

同步方法不起作用,但同步块起作用,为啥?

为啥这种方法不起作用?

方法不起作用

css 为啥有时MARGIN 不起作用,