You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby代码报错:undefined method `location' for nil:NilClass 求助

问题排查与修复

核心错误:read_tracks 循环逻辑完全错误

你的read_tracks函数里,初始化trackcount = count后,循环条件写的是while trackcount < count——初始值已经等于count,循环永远不会执行,导致tracks数组始终为空。后续你尝试访问tracks中元素的location方法时,自然会触发nil:NilClass的错误(空数组里没有任何Track对象,取到的元素是nil)。

修复后的read_tracks代码:

def read_tracks(pineapple_music, count)
    tracks = Array.new
    trackcount = 0  # 初始值改为0,从0开始计数
    while trackcount < count
        track = read_track(pineapple_music)
        tracks << track 
        trackcount += 1 
    end
    return tracks
end

次要问题优化(避免后续潜在bug)

  1. read_track 未处理换行符
    gets会保留输入末尾的换行符,建议添加chomp清理,避免Track的名称和路径带多余的换行符:

    def read_track(pineapple_music)
        song = pineapple_music.gets.chomp
        file = pineapple_music.gets.chomp
        t = Track.new(song, file)
        return t
    end 
    
  2. album_genre 错误转为整数
    流派(genre)是字符串类型(比如"Pop"、"Jazz"),你当前用to_i转换会把非数字字符串转为0,完全不符合逻辑,应该去掉to_i:

    album_genre = music_file.gets.chomp  # 移除.to_i
    
  3. 可选:添加文件读取异常处理
    当前代码没处理文件不存在的情况,可简单加个捕获逻辑:

    def read_file(pineapple_music)
        begin
            music_file = File.new(pineapple_music, "r")
            albums = read_albums(music_file)
            music_file.close()
            return albums
        rescue Errno::ENOENT
            puts "错误:文件 #{pineapple_music} 不存在"
            return []
        end
    end
    

验证逻辑

修复核心循环问题后,read_tracks会正确循环count次,读取对应数量的Track对象存入数组,后续访问track.location时就不会出现nil调用方法的错误。

内容的提问来源于stack exchange,提问作者LycoReco2007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:25:12